React hoos useImperativeHandle

news/2024/7/15 19:34:18 标签: react.js, javascript, 前端

1.前言

相比大家看到useImperativeHandle会感到十分陌生,但部分开源代码经常会出现它的身影、接下来我把我理解的内容写下来,有不对的地方欢迎友友们指出.

2.useImperativeHandle定义

React官网的定义

  • useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值。在大多数情况下,应当避免使用 ref 这样的命令式代码。useImperativeHandle 应当与 forwardRef 一起使用
  • 用了ref的桥梁就可以在父组件中控制子组件了,而不仅仅只是子随父渲染了

个人理解

  • useImperativeHandle的作用是将子组件的指定元素暴漏给父组件使用。也就是父组件可以访问到子组件内部的特定元素。

3.获取元素的几种方式

  • 3.1 useRef:获取组件内部元素

    javascript">import {useRef} from "react"
    export default function() {
      //1. 获取组件内部元素
      const ele = useRef()
      //2. 获取组件内部元素
      const getElememnt = () => {
        console.log(ele.current)
      }
      return <div >
        <button onClick={()=>getElememnt()}>获取元素</button>
      //3. 获取组件内部元素
        <p ref={ref}></p>
      </div>
    }
    

    点击按钮,我们可以获取到p元素。上面是useRef获取元素的方法

    • 引入useRef,定义变量
    • 在需要获取的dom元素上使用ref进行变量绑定
    • 使用变量.current获取对应元素
  • 3.2 forwardRef

    • 父组件获取子组件内部的一个元素
      上面的useRef在函数组件可以获取自身组件内部的元素,但是如果我们需要在父组件获取或者操作儿子组件的一个元素,这时就会用到forwardRef

      javascript">//父组件
      import {useRef} from "react"
      import Son from "./son"
      export default function(){
        const ele = useRef()
        const getElement = () => {
          console.log(ele.current)
        }
        return <div>
          <button onClick={()=>getElement()}>点击获取子组件的元素</button>
          <Son ref={ele}/></div>
      }
      
      javascript">//son.js
      import {forwardRef} from "react"
      
      export default forwardRef(function(props,ref){
        return <div >
          <p ref={ref}></p>
        </div>
      })
      
      1. 父元素点击按钮后,可以获取到儿子组件的p元素。

      2. forwardRef在父组件获取儿子组件内部一个元素时,操作如下。

      3. 父组件按照useRef的规则绑定到儿子组件上

      4. 儿子组件使用forwardRef包裹,并在函数组件传递的参数接收,第一个参数porps接收父组件传递的数据,第二个ref接收的就是dom引用

      5. 在需要获取儿子组件的元素上直接绑定ref的值

  • 3.3 useImperativeHandle

    • 父组件可以获取/操作儿子组件多个元素

    • 它可以在父组件内部直接获取儿子组件任意的dom元素对象。

      javascript">//父组件
      import {useRef} from "react"
      import Son from "./son"
      export default function(){
        const ele = useRef()
        const getElement = () => {
          console.log(ele.current.ele1.current)
          console.log(ele.current.ele2.current)
        }
        return <div>
          <button onClick={()=>getElement()}>点击获取子组件元素</button>
          <Son ref={ele}/></div>
      }
      
      //son.js
      import {useRef,forwardRef,useImperativeHandle} from "react"
      export default forwardRef(function(props,ref){
        const ele1 = useRef()
        const ele2 = useRef()
        
        useImperativeHandle(ref,()=>{
          return {ele1,ele2}
        },[])
      
        return <div >
          <h2 ref={ele1}></h2>
          <h3 ref={ele2}></h3>
        </div>
      })
      
      javascript">结果
      <h2></h2>
      <h3></h3>
      
    • 父组件点击按钮后,可以一次性获取到多个标签元素,通过useImperativeHandle函数内部返回的对象可以获取对应的标签。列举下useImperativeHandle的参数

      javascript">useImperativeHandle(ref,()=>{
          return {dom1,dom2}
      },[])
      
    • 第一个参数是组件的第二个参数ref

    • 第二个参数是一个回调函数,内部返回的对象就是抛给父组件的元素对象

    • 第三个参数是一个依赖数组,类似useEffect的依赖数组,如果依赖数组内部传递的数据发生改变,就会重新触发回调函数


http://www.niftyadmin.cn/n/374691.html

相关文章

面向小白的最全Python数据分析指南,超全的!

因工作需求经常会面试一些数据分析师&#xff0c;一些 coding 能力很强的小伙伴&#xff0c;当被问及数据分析方法论时一脸懵逼的&#xff0c;或者理所当然的认为就是写代码啊&#xff0c;在文章开头先来解释一下数据分析。 数据分析是通过明确分析目的&#xff0c;梳理并确定…

MySQL数据库——索引到底对查询速度有什么影响?

索引在数据库中起着至关重要的作用&#xff0c;对查询速度有着显著的影响。在本文中&#xff0c;我将详细讲解索引对查询速度的影响&#xff0c;并解释索引是如何工作的。 1、索引的基本概念&#xff1a; 索引是一种数据结构&#xff0c;用于加快数据的检索速度。它类似于书籍…

【满分】【华为OD机试真题2023B卷 JAVAJS】经典屏保

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 经典屏保 知识点循环迭代编程基础 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: DVD机在视频输出时,为了保护电视显像管,在待机状态会显示“屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹…

分割回文串

1题目 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xff1a;s "aab" 输出&#xff1a;[["a","…

中科院博士分享:如何避免SCI写作中的中式思维以及无处不在的Chinglish

中科院博士分享&#xff1a;如何避免SCI写作中的中式思维以及无处不在的Chinglish 现在随着全球经济的下行&#xff0c;很多小伙伴都选择了延时就业&#xff0c;因此更多的人开始考研和考博。新东方大学生学习与发展中心发布的《新东方2023考研报告》预测&#xff1a;2023考研报…

Idea+maven+springboot项目搭建系列--1 整合Rocketmq

前言&#xff1a;本文以mavenspringboot 整合Rocketmq 完成消息的发送和接收。 1 Rocketmq 介绍&#xff1a; 1.1 Rocketmq 特性&#xff1a; Apache RocketMQ是一款快速、可靠的分布式消息传递和流处理平台&#xff0c;具有可扩展性和高性能。它是一个分布式的、去中心化的消…

十、Camera 启动流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Camera 启动流程概览二、Launcher 跟Camera APP 交互三、Camera app 与FWK Camera Service 交互四、Camera FWK 与 Camera HAL 交互五、Camera FWK…

基于微信小程序制作一个记账小工具

你不理财,财不理你,制作一个记账小程序对自己的收入/支出明细进行管理,守护好自己的钱袋子。 一、小程序1.1 项目创建1.2 首页1.3 收支报表页1.4 记账提交页1.5 记账列表页