iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >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://www.lsjlt.com/news/352064.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 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
  • waifu2x方法怎么使用
    要使用Waifu2x方法,你可以按照以下步骤进行: 打开Waifu2x的网页或下载相应的软件。Waifu2x有许多不同的版本和实...
    99+
    2023-10-26
    waifu2x
  • Window.open()方法怎么使用
    window.open()方法用于打开一个新的浏览器窗口,并返回一个对这个新窗口的引用。语法:window.open(URL, na...
    99+
    2023-09-06
    Window.open()
  • .removeAttr方法怎么使用
    这篇文章主要介绍“.removeAttr方法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.removeAttr方法怎么使用”文章能帮助大家解决问题。  ...
    99+
    2024-04-02
  • preventDefault()方法怎么使用
    preventDefault()方法用于取消事件的默认行为。在JavaScript中,可以通过以下方式使用preventDefaul...
    99+
    2023-09-05
    preventDefault()
  • Java Hibernate使用方法怎么使用
    今天小编给大家分享一下Java Hibernate使用方法怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。J...
    99+
    2023-07-05
  • android inflate方法怎么使用
    在Android中,`inflate()`方法主要是用来将一个布局文件转换为对应的View对象,即将XML布局文件转换为Java对象...
    99+
    2023-08-24
    android inflate
  • jquery toggle方法怎么使用
    jQuery的toggle()方法可以用于切换元素的可见性。它根据元素的当前状态决定是显示还是隐藏元素。使用toggle()方法的语...
    99+
    2023-09-20
    jquery
  • ASP MapPath方法怎么使用
    ASP MapPath方法用于获取Web应用程序中的虚拟路径的物理路径。以下是使用MapPath方法的示例:1. 使用相对路径:``...
    99+
    2023-10-12
    ASP
  • jQuery keypress()方法怎么使用
    jQuery的keypress()方法用于在元素上触发键盘按下事件。它绑定一个事件处理程序来处理按键事件。以下是keypress()...
    99+
    2023-10-12
    jQuery
  • Python write()方法怎么使用
    Python的`write()`方法用于将指定的字符串写入文件。它的使用方法如下:```pythonfile.write(str)`...
    99+
    2023-10-12
    Python
  • Lodash uniqueId()方法怎么使用
    Lodash的uniqueId()方法用于生成一个全局唯一的字符串。该方法没有任何参数。可以通过以下步骤来使用uniqueId()方...
    99+
    2023-10-18
    Lodash
  • python readline方法怎么使用
    readline()方法在Python中用于从文件中按行读取数据。它的基本语法如下: file.readline() 其中,file...
    99+
    2024-02-29
    python
  • java retainAll方法怎么使用
    Java中的retainAll方法是用于获取两个集合的交集。它会修改调用该方法的集合,使其只包含两个集合共有的元素。 使用retai...
    99+
    2024-02-29
    java
  • Window history.go()方法怎么使用
    Window.history.go()方法用于在浏览器历史记录中向前或向后导航。该方法接受一个整数参数,表示向前或向后导航的步数。使...
    99+
    2023-09-05
    Window
  • string compareto方法怎么使用
    String类的compareTo方法用于比较两个字符串的大小关系。它的使用方法如下: 语法: int compareTo(Stri...
    99+
    2023-10-25
    string
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作