返回顶部
首页 > 资讯 > 精选 >ForwardRef useImperativeHandle方法怎么使用
  • 795
分享到

ForwardRef useImperativeHandle方法怎么使用

2023-07-05 13:07:53 795人浏览 薄情痞子
摘要

本文小编为大家详细介绍“ForwardRef useImperativeHandle方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“ForwardRef useImperativeHandle方法怎么使用”文

本文小编为大家详细介绍“ForwardRef useImperativeHandle方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“ForwardRef useImperativeHandle方法怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、获取Ref的方式

  • 使用字符串

  • 使用函数

  • 使用Ref对象(最常见)

  • 使用createRef

export class RefTest extends React.Component {    currentDom: React.RefObject<htmlDivElement> = React.createRef();    currentChildren: React.LegacyRef<Children> = React.createRef();    render() {        console.log(this.currentChildren, this.currentDom);    return (        <>            <div ref = { this.currentDom }>你好</div>            <Children ref = { this.currentChildren}></Children>        </>       )    }}

ForwardRef useImperativeHandle方法怎么使用

  • 使用useRef

export const RefTest = () => {    const currentDom = useRef(null);    const currentChildren = useRef(null);    useEffect(() => {        console.log(currentChildren, currentDom, '这里也可以打印出来了');     },[])   return (   <>       <div ref = { currentDom }>你好</div>       <Children ref = { currentChildren }></Children>   </>    )}

二、Ref实现组件通信

  • 既然ref可以获取到子组件的实例,那么就可以拿到子组件上的状态和方法,从而可以实现组件之间的通信

来个极简版

ForwardRef useImperativeHandle方法怎么使用

import React, { useEffect } from 'react';class Son extends React.Component{    state={        sonValue:''    }    render(){    return <div>        <div>子组件的信息: {this.state.sonValue}</div>        <div>对父组件说</div>        <input onChange{(e)=>this.props.setFather(e.target.value)}/>        </div>    }}export default function Father(){const [ fatherValue , setFatherValue ] = React.useState('')const sonRef = React.useRef(null)return <div>    <div>父组件的信息: {fatherValue}</div>    <div>对子组件说</div>    <input onChange = { (e) => sonRef.current.setState( {sonValue: e.target.value})}/>    <Son ref={sonRef} setFather={setFatherValue}/>    </div>}

ForwardRef useImperativeHandle方法怎么使用

三、ForwardRef

  • 上面说的三种都是组件去获取其DOM元素或者子组件的实例,当开发变得复杂时,我们可能有将ref跨层级捕获的需求,也就是可以将ref进行转发

比如跨层级获取ref信息

ForwardRef useImperativeHandle方法怎么使用

  • 来个例子, 我们希望能够在GrandFather组件获取到Son组件中

![图片转存失败,建议将图片保存下来直接上传        import React from 'react';interface IProps {    targetRef: React.RefObject<HTMLDivElement>    otherProps: string}interface IGrandParentProps {    otherProps: string}class Son extends React.Component<IProps> {    constructor(props) {        super(props);        console.log(props,'son中的props');     }     render() {         // 最终目标是获取该DOM元素的信息         return <div ref= { this.props.targetRef }>真正目的是这个</div>     }}class Farther extends React.Component<IProps> {    constructor(props) {        super(props)        console.log(props, 'father中的props');    }    render() {        return (        // 继续将ref传给Son            <Son targetRef={this.props.targetRef} {...this.props} />         )    }}// 在这里使用了forwardRef, 相当于把传入的ref转发给Father组件const ForwardRef = React.forwardRef((props: IGrandParentProps, ref: React.RefObject<HTMLDivElement>)     => <Farther targetRef={ref} {...props}/>) image.png(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5d49e7ff4ec940b28dcb3a780fd5c0a7~tplv-k3u1fbpfcp-watermark.image?)export class GrandFather extends React.Component {    currentRef:React.RefObject<HTMLDivElement> = React.createRef();    componentDidMount() {        // 获取到的Ref信息        console.log(this.currentRef, 'componentDidMount');    }    render() {        return (        <ForwardRef ref={this.currentRef} otherProps = '正常传递其他props' />        )    }}]()
  • 打印结果: 其实就是利用了forwardRef,把 ref 变成了可以通过 props 传递和转发

ForwardRef useImperativeHandle方法怎么使用

四、 useImperativeHandle

  • 上面我们一直说的都是获取子组件的实例,但是实际上我们函数组件是没有实例的,故我们需要借助useImperativeHandle, 使用forwardRef+useImperativeHandle就可以在函数组件中流畅地使用ref

  • useImperativeHandle可以传入三个参数:

    • ref: 可以接受forwardRef传入的ref

    • handleFunc: 返回值作为暴露给父组件的ref对象

    • deps: 依赖项,当依赖项改变的时候更新形成的ref对象

看完参数其实就能够清楚地知道它的作用了,可以通过forwardRef+useImperativeHandle自定义获取到的ref信息

再来两个简单例子:

import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from "react"const ForwardItem = forwardRef((props, ref) => {    const [sonValue, setSonValue] = useState('修改之前的值');    useImperativeHandle(ref, () => ({        setSonValue,    }))    return (        <div>子组件的值: {sonValue}</div>    )})export const Father = () => {    const testRef = useRef(null);    useEffect(() => {        console.log(testRef.current, 'ref获取到的信息')     })    const changeValue = () => {        const DURATION = 2000;        setTimeout(() => {        testRef.current.setSonValue('我已经修改值啦')        },DURATION)    }    return (    <>       <ForwardItem ref={ testRef }/>       <button onClick={() => changeValue()}>2s后修改子组件ForwardItem的值</button>    </>    )}
  • 父组件希望直接调用函数子组件的方法

    • 这里让useImperativeHandle形成了有setSonValue的ref对象,然后再在父组件调用该方法

  • 父组件希望获取到子组件的某个DOM元素

const ForwardItem = forwardRef((props, ref) => {    const elementRef: RefObject<HTMLDivElement> = useRef();    useImperativeHandle(ref, () => ({        elementRef,    }))    return (        <div ref = { elementRef }>我是一个子组件</div>     )})export const Father = () => {    const testRef = useRef(null);    useEffect(() => {        console.log(testRef.current, 'ref获取到的信息')     })    return (    <>        <ForwardItem ref={ testRef }/>    </>    )}

ForwardRef useImperativeHandle方法怎么使用

读到这里,这篇“ForwardRef useImperativeHandle方法怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: ForwardRef useImperativeHandle方法怎么使用

本文链接: https://lsjlt.com/news/352064.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ForwardRef useImperativeHandle方法怎么使用
    本文小编为大家详细介绍“ForwardRef useImperativeHandle方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“ForwardRef useImperativeHandle方法怎么使用”文...
    99+
    2023-07-05
  • ForwardRef useImperativeHandle方法demo
    目录一、获取Ref的方式二、Ref实现组件通信三、ForwardRef四、 useImperativeHandle一、获取Ref的方式 使用字符串使用函数使用Ref对象(最常见) ...
    99+
    2023-03-19
    ForwardRef useImperativeHandle ForwardRef useImperativeHandle方法
  • react中的useImperativeHandle()和forwardRef()用法
    目录一、useImperativeHandle()二、forwardRef()三、案例父组件子组件一、useImperativeHandle() useImperativeHandl...
    99+
    2022-11-13
    react中useImperativeHandle react中forwardRef
  • React forwardRef的使用方法及注意点
    之前使用react.forwardRef始终无法应用于react高阶组件中,最近终于捣鼓出来了,于是记录下来。关键点就是React.forwardRef的API中ref必须指向dom...
    99+
    2024-04-02
  • 怎么使用Promise方法
    这篇文章主要介绍“怎么使用Promise方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Promise方法”文章能帮助大家解决问题。 以下是使用 Pro...
    99+
    2024-04-02
  • .removeAttr方法怎么使用
    这篇文章主要介绍“.removeAttr方法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.removeAttr方法怎么使用”文章能帮助大家解决问题。  ...
    99+
    2024-04-02
  • Window.open()方法怎么使用
    window.open()方法用于打开一个新的浏览器窗口,并返回一个对这个新窗口的引用。语法:window.open(URL, na...
    99+
    2023-09-06
    Window.open()
  • preventDefault()方法怎么使用
    preventDefault()方法用于取消事件的默认行为。在JavaScript中,可以通过以下方式使用preventDefaul...
    99+
    2023-09-05
    preventDefault()
  • waifu2x方法怎么使用
    要使用Waifu2x方法,你可以按照以下步骤进行: 打开Waifu2x的网页或下载相应的软件。Waifu2x有许多不同的版本和实...
    99+
    2023-10-26
    waifu2x
  • Java Hibernate使用方法怎么使用
    今天小编给大家分享一下Java Hibernate使用方法怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。J...
    99+
    2023-07-05
  • java sort方法怎么使用
    Java中的`sort()`方法可以用来对数组或集合进行排序。你可以按照以下方式使用`sort()`方法:1. 对数组排序:```j...
    99+
    2023-09-27
    java
  • java binarysearch方法怎么使用
    Java的BinarySearch方法可以用于在已排序的数组中快速查找指定元素的索引。它的用法如下:1. 确保数组已经排序。Bina...
    99+
    2023-09-26
    java
  • sql bulk方法怎么使用
    SQL的BULK方法用于将数据从一个表复制到另一个表。它可以大大提高数据加载的性能。使用BULK方法的步骤如下:1. 创建源表和目标...
    99+
    2023-09-27
    sql
  • jquery toggle方法怎么使用
    jQuery的toggle()方法可以用于切换元素的可见性。它根据元素的当前状态决定是显示还是隐藏元素。使用toggle()方法的语...
    99+
    2023-09-20
    jquery
  • java replace方法怎么使用
    Java中replace方法用于替换字符串中的指定字符或者字符串。它有两个重载的方法:1. `replace(char oldCha...
    99+
    2023-09-20
    java
  • python register方法怎么使用
    在Python中,`register()`方法是用来注册函数或方法作为回调函数的。它通常用于事件驱动的编程,当某个事件发生时,注册的...
    99+
    2023-09-16
    python
  • java default方法怎么使用
    Java 8引入了默认方法(Default Method),也称为接口默认方法(Interface Default Method)。...
    99+
    2023-10-10
    java
  • 怎么使用thinkphp d方法
    这篇文章主要介绍“怎么使用thinkphp d方法”,在日常操作中,相信很多人在怎么使用thinkphp d方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用thinkphp d方法”的疑惑有所帮助!...
    99+
    2023-06-25
  • python contains方法怎么使用
    Python中的`contains()`方法用于检查一个字符串是否包含另一个字符串,并返回一个布尔值。其使用方法如下:```pyth...
    99+
    2023-09-12
    python
  • Window history.go()方法怎么使用
    Window.history.go()方法用于在浏览器历史记录中向前或向后导航。该方法接受一个整数参数,表示向前或向后导航的步数。使...
    99+
    2023-09-05
    Window
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作