Reat 中的 useImperativeHandle 钩子函数

news2024/10/6 10:38:36

通过例子说明 ref 的不足

当我们需要调用子组件中的方法时,我们都是考虑使用useRef来调用子组件的方法,具体的示例代码如下:

// 父级组件
const UseImperativeHandleDemo: React.FC = () => {
  const inputRef = useRef<HTMLInputElement>(null);

  return (
    <div>
      <CustInput ref={inputRef} initVal={"123"} />
      <button onClick={() => inputRef.current?.focus()}>获取焦点</button>
    </div>
  );
};

// CustInput子组件
const CustInput = React.forwardRef<HTMLInputElement, CustInputProp>(
  (
    props: CustInputProp,
    ref: React.ForwardedRef<HTMLInputElement>
  ): JSX.Element => {
    return <input ref={ref} value={props.initVal} onChange={() => {}} />;
  }
);

这个例子中我们只是将一个引用直接传递给组件内部的单个元素,那是没有问题的,假如我们需要功能做的更加复杂一点或者需要自定义引用时,代码开发难度可能就会大大提升。

在上述例子中使用 useImperativeHandle 钩子函数扩展自定义函数

我们在上述例子的基础上使用useImperativeHandle钩子函数进行自定义函数的扩展,扩展后我们就可以在父级组件调用子组件的方法。

使用useImperativeHandle钩子函数后我们就可以在子组件中随意定义方法对外暴露方法。具体的实例如下:

const CustInput = React.forwardRef<any, CustInputProp>(
  (props: CustInputProp, ref: React.ForwardedRef<any>): JSX.Element => {
    useImperativeHandle(
      ref,
      () => {
        return { alertHi: () => alert(props.initVal) };
      },
      []
    );

    return <input value={props.initVal} onChange={() => {}} />;
  }
);

// 父组件
<button
  onClick={() => {
    inputRef.current?.alertHi(); // 调用子组件自定义的方法
  }}
>
  获取焦点
</button>;

使用 useImperativeHandle 钩子函数控制子组件中的多个元素

在上一小节我们简单实用了useImperativeHandle钩子函数进行了子组件自定义函数的扩展,在本小节中,我们可以使用useImperativeHandle钩子函数实现控制子组件中多个元素。

首先我们先看一下我们要实现的例子,具体界面如下:

在这里插入图片描述

在上述的页面中,我们的业务需求是让上述对应的按钮控制对应子组件中对应元素的焦点,我们可以在父级组件把对应的方法编写好以后传递给子组件,但是这样就会破坏单一职责原则,所以我们可以使用useImperativeHandle钩子来实现,具体的代码如下:

// 父级组件
const [open, setOpen] = useState<boolean>(false)
const modalRef = useRef<any>(null)

 <div>
  <button onClick={() => setOpen(true)}>open</button>
  <button onClick={() => modalRef.current.closeFocus()}>focus close</button>
  <button onClick={() => modalRef.current.confirmFocus()}>focus confirm</button>
  <button onClick={() => modalRef.current.denyFocus()}>focus deny</button>
  <ConfirmationModal
    ref={modalRef}
    isOpen={open}
    onClocse={() => setOpen(false)}
  />
</div>

// 子组件
const ConfirmationModal = React.forwardRef<any, ConfirmationModalProps>(
  ({ isOpen, onClocse }: ConfirmationModalProps, ref: React.ForwardedRef<any>): JSX.Element => {
    const closeRef = useRef<HTMLButtonElement>(null)
    const confirmRef = useRef<HTMLButtonElement>(null)
    const denyRef = useRef<HTMLButtonElement>(null)

    useImperativeHandle(ref, () => {
      return {
        closeFocus: () => closeRef.current?.focus(),
        confirmFocus: () => confirmRef.current?.focus(),
        denyFocus: () => denyRef.current?.focus()
      }
    }, [])

    if (!isOpen) return <></>

    return (
      <div className="modal">
        <button className="close-btn" ref={closeRef} onClick={(e) => onClocse()}>&times;</button>
        <div className="modal-header">
          <h1>title</h1>
        </div>
        <div className="modal-body">
          do yo confirm?
        </div>
        <div className="modal-footer">
          <button className="confirm-btn" ref={confirmRef} onClick={() => onClocse()}>Yes</button>
          <button className="deny-btn" ref={denyRef} onClick={() => onClocse()}>No</button>
        </div>
      </div>
    )
  }
)

总结

通过上述两个简单的例子,我们可以看到useImperativeHandle的钩子函数主要是简化我们对子组件的控制,即可以在子组件中实现自定义函数和控制子组件中的元素。这就是useImperativeHandle钩子函数的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1034057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux忘记密码

在虚拟机安装了centOS7&#xff0c;但是忘记了root密码&#xff0c;登录的时候发现登录不上了&#xff0c;然后重新修改密码。 1、重启虚拟机 2、进入到该页面之后&#xff0c;选中第一个&#xff08;高亮显示即为选中&#xff09;选项&#xff0c;然后按下键盘的“E”键 3…

每日一题 1993. 树上的操作

难度&#xff1a;中等 思路&#xff1a; 首先为了更好的访问每个节点的子节点&#xff0c;我们创建一个字典来表示key节点下的所有子节点&#xff0c;其次上锁&#xff0c;解锁不用多说升级过程&#xff0c;对于条件一和三可以理解为同一个&#xff0c;即包括它本身在内的所有…

基于springboot+vue的大学生竞赛交流系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

人工智能机器学习-飞桨神经网络与深度学习

飞桨神经网络与深度学习-机器学习 目录 飞桨神经网络与深度学习-机器学习 1.机器学习概述 2.机器学习实践五要素 2.1.数据 2.2.模型 2.3.学习准则 2.4.优化算法 2.5.评估标准 3.实现简单的线性回归模型 3.1.数据集构建 3.2.模型构建 3.3.损失函数 3.4.模型优化 3…

Vue的进阶使用--模板语法应用拓展(表单及组件通信)

目录 ​编辑 一.事件处理器 1.监听事件 1.1首先定义监听事件&#xff0c;并定义调用的方法 1.2编写调用的方法 案例演示 1.编写HTML层 2.编写方法 2.Vue.js阻止重复请求 2.1模拟请求操作 2.2 测试结果及结论 二.表单验证 1.基础表单验证 1.1 HTML层 1.2JS层 …

数字经济水平测算(内含4种版本2种方式)-地级市(2011-2021年)

参照赵涛等&#xff08;2020&#xff09;的文章&#xff0c;利用熵值法和主成分对城市数字经济水平进行测算&#xff0c;包括原始数据及测算结果。内含4种版本2种方式&#xff0c;在8种情况下测算的数字经济水平。 一、数据介绍 数据名称&#xff1a;地级市-数字经济水平测算…

栈的简单应用(利用Stack进行四则混合运算)(JAVA)

目录 中缀表达式转后缀表达式 图解 代码实现过程&#xff1a; 完整代码&#xff1a; 利用后缀表达式求值&#xff1a; 完整代码&#xff1a; 首先我们得先了解逆波兰表达式。 中缀表达式转后缀表达式 所谓的中缀表达式其实就是我们平时写的例如&#xff1a;&#xff1…

基于SpringBoot的墙绘产品展示交易平台设计与实现

目录 前言 一、技术栈 二、系统功能介绍 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本墙绘产…

生活垃圾数据集(YOLO版)

文章目录 1、数据集介绍1.1、数据集图片组成2.1、获取数据集方式 2、扩展代码2.1、文件结构树2.2、划分数据集2.3、获取数据集文件名字2.4、文件成功对应检测 3、其他文章 1、数据集介绍 1.1、数据集图片组成 【有害垃圾】&#xff1a;电池&#xff08;1 号、2 号、5 号&…

TensorFlow安装 ,在原本的虚拟环境下配置Tensorflow.

1.TensorFlow安装 &#xff0c;在原本的虚拟环境下配置Tensorflowh和pytorch 2.我首先在anaconda的环境下创建了一个tensorflow文件夹 如何先进入D盘&#xff0c;再进入tensorflow文件夹的目录D:cd D:\Anaconda\TensorFlowSoftWarepip install tensorflow如图所示报错解决方法 …

软件设计师考试学习2

数据结构与算法基础 数组 稀疏矩阵 用代入法计算&#xff0c;A 数据结构的定义 非线性结构分为树和图&#xff0c;区别在于有没有环路 顺序表与链表 引入头节点可以使所有的节点处理方式一致 如果没有空的头节点&#xff0c;头节点需要单独处理 顺序存储与链式存储 查找…

文件操作(2)

目录 文件操作的步骤&#xff1a; 流&#xff1a; 标准流&#xff1a; 文件指针&#xff1a; 文件信息区&#xff1a; 概念&#xff1a; 关系转化&#xff1a; 注意&#xff1a; 文件指针&#xff1a; 文件的打开和关闭&#xff1a; 打开方式&#xff1a; 打开成…

虹科方案 | LIN/CAN总线汽车零部件测试方案

文章目录 摘要一、汽车零部件测试的重要性&#xff1f;二、虹科的测试仿真工具如何在汽车零部件测试展露头角&#xff1f;三、应用场景**应用场景1&#xff1a;方向盘开关的功能测试****应用场景2&#xff1a;各类型电机的控制测试****应用场景3&#xff1a;RGB氛围灯的功能测试…

基于STM32+华为云IOT设计的智能门禁系统

一、项目介绍 智能门禁系统是一种应用物联网技术的智能化安防系统&#xff0c;提供安全高效的门禁管理和远程监控功能。传统的门禁系统通常使用磁卡、密码或钥匙等方式进行开锁&#xff0c;但存在易丢失、易复制、操作繁琐等问题。为了解决这些问题&#xff0c;并提高门禁安全…

postman-pre-request-scripts使用

一、场景 二、定义模拟接口 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using SaaS.Framework.DataTransfer; using System.Threading.Tasks;namespace SaaS.KDemo.Api.Controllers {[Route("api/[co…

引领初创企业的数字化转型:选择适合的低代码平台

初创企业在初期各项架构都还不完善&#xff0c;对于应用程序的需求多样&#xff0c;但是又要考量成本。所以&#xff0c;低代码平台就是在综合考量成本和需求的情况下的一个突出的选择。下面我们就六个方面为您介绍&#xff1a;初创企业选择的Zoho Creator低代码平台。 1、功能…

PREEvision Client 10.8.0

PREEvision Client 10.6.0 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

php代码审计篇熊海cms代码审计

文章目录 自动审计逐个分析首页index.php文件包含漏洞后台逻辑漏洞cookie绕过登录后台sql报错注入存储型XSS 结束吧 自动审计 看到有很多 逐个分析 首页index.php文件包含漏洞 读一下代码&#xff0c;可以看到很明显的一个文件包含 <?php //单一入口模式 error_repor…

(1) ESP32获取图像,并通过电脑端服务器显示图像

目录​​​​​​​ 一、所需器件工具 二、客户端与服务器进行UDP通信 1、客户端代码 2、服务器端代码 3、效果展示 三、客户端拍照&#xff0c;通过UDP传输到服务器进行显示 1、客户端获取图像并UDP传输 2、电脑端服务器显示图像 3、效果展示 四、代码链接 一、所需器…

高压放大器电源有什么作用和用途

高压放大器是一种专门用于放大高压信号的电子设备。它可以将低幅度的输入信号放大成高幅度的输出信号&#xff0c;用于驱动高压负载或处理高压信号。然而&#xff0c;高压放大器需要特定的电能来运行&#xff0c;而这就是电源的作用。 高压放大器电源的主要作用是为高压放大器提…