我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ForwardRef useImperativeHandle方法怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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方法怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ForwardRef useImperativeHandle方法怎么使用

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

下载Word文档

猜你喜欢

ForwardRef useImperativeHandle方法怎么使用

本文小编为大家详细介绍“ForwardRef useImperativeHandle方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“ForwardRef useImperativeHandle方法怎么使用”文章能帮助大家解决疑惑
2023-07-05

ForwardRef useImperativeHandle方法demo

这篇文章主要为大家介绍了ForwardRef useImperativeHandle方法demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-19

react中的useImperativeHandle()和forwardRef()用法

这篇文章主要介绍了react中的useImperativeHandle()和forwardRef()用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

preventDefault()方法怎么使用

preventDefault()方法用于取消事件的默认行为。在JavaScript中,可以通过以下方式使用preventDefault()方法:1. 通过事件对象使用preventDefault()方法:```javascripteleme
2023-09-05

waifu2x方法怎么使用

要使用Waifu2x方法,你可以按照以下步骤进行:打开Waifu2x的网页或下载相应的软件。Waifu2x有许多不同的版本和实现方式,你可以选择适合你的平台和需求的版本。准备要提升分辨率的图像。你可以选择从你的计算机中选择图像文件,或者在一
2023-10-26

Window.open()方法怎么使用

window.open()方法用于打开一个新的浏览器窗口,并返回一个对这个新窗口的引用。语法:window.open(URL, name, specs, replace)参数说明:- URL:要在新窗口中打开的URL地址。可以是一个绝对路径
2023-09-06

Java Hibernate使用方法怎么使用

今天小编给大家分享一下Java Hibernate使用方法怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Jpa是满足
2023-07-05

jquery toggle方法怎么使用

jQuery的toggle()方法可以用于切换元素的可见性。它根据元素的当前状态决定是显示还是隐藏元素。使用toggle()方法的语法如下:```javascript$(selector).toggle();```其中,selector是一
2023-09-20

java validate方法怎么使用

在Java中,要使用validate方法,首先需要确保你正在使用的是合适的类或接口。一些常见的使用validate方法的类或接口包括:javax.validation.Validator:用于验证Java Bean的实例。javax.xm
2023-10-24

Android onFinishInflate方法怎么使用

在Android中,onFinishInflate方法是View类中的一个方法,用于在View被inflate(填充)后调用。具体使用方法如下:1. 在自定义的View类中,重写onFinishInflate方法。代码示例:```javap
2023-10-12

jquery include方法怎么使用

本篇内容介绍了“jquery include方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是jQuery include方法
2023-07-05

java toarray方法怎么使用

在Java中,toArray()方法用于将集合(如List、Set等)转换为数组。它可以按照集合的迭代顺序,将集合中的元素复制到新的数组中。使用toArray()方法的一般语法如下:javaObject[] array = collecti
2023-10-20

java default方法怎么使用

Java 8引入了默认方法(Default Method),也称为接口默认方法(Interface Default Method)。默认方法是在接口中定义的具有默认实现的方法。这使得接口能够在不破坏实现类的情况下向已有接口添加新的方法。要使
2023-10-10

python contains方法怎么使用

Python中的`contains()`方法用于检查一个字符串是否包含另一个字符串,并返回一个布尔值。其使用方法如下:```pythonstring.contains(substring)```其中,`string`是要检查的字符串,`su
2023-09-12

jQuery ajax()方法怎么使用

jQuery的ajax()方法用于向服务器发送HTTP请求。它可以接收一个对象作为参数,该对象用于指定请求的方法、URL、数据、成功回调函数等信息。以下是ajax()方法的使用方法:1. 最简单的用法是仅指定请求的URL和成功回调函数:``
2023-10-12

jQuery keypress()方法怎么使用

jQuery的keypress()方法用于在元素上触发键盘按下事件。它绑定一个事件处理程序来处理按键事件。以下是keypress()方法的使用示例:```javascript$(document).keypress(function(eve
2023-10-12

java retainAll方法怎么使用

Java中的retainAll方法是用于获取两个集合的交集。它会修改调用该方法的集合,使其只包含两个集合共有的元素。使用retainAll方法的语法如下:boolean retainAll(Collection c)其中,c为另一
java retainAll方法怎么使用
2024-02-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录