首页 > 其他分享 >React 系列 useImperativeHandle

React 系列 useImperativeHandle

时间:2024-01-14 12:32:18浏览次数:32  
标签:count 系列 useImperativeHandle React Child 组件 const ref

React Hooks 为我们提供了一种全新的方式来处理组件的状态和生命周期。其中,useImperativeHandle 是一个相对较少被提及的 Hook,但在某些场景下,它是非常有用的。本文将深入探讨 useImperativeHandle 的用法,并通过实例来加深理解。

什么是 useImperativeHandle

useImperativeHandle 允许你自定义通过 ref 暴露给父组件的实例值。通常,我们使用 ref 来访问组件的 DOM 元素或类组件的实例。但有时,我们可能希望向父组件暴露子组件的某些特定方法,而不是整个实例或 DOM 元素。这时,useImperativeHandle 就派上了用场。

基本用法

当你想从子组件向父组件暴露某些特定的方法时,可以使用 useImperativeHandle

import React, { useRef, useImperativeHandle, forwardRef } from "react";

const Child = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    sayHello() {
      console.log("Hello from Child!");
    },
  }));
  return <div>Child Component</div>;
});

function Parent() {
  const childRef = useRef(null);

  const handleClick = () => {
    childRef.current.sayHello();
  };

  return (
    <>
      <Child ref={childRef} />
      <button onClick={handleClick}>Call Child Method</button>
    </>
  );
}

与其他 Hooks 结合使用

useImperativeHandle 可以与其他 Hooks 如 useState 和 useEffect 结合使用。

const Child = forwardRef((props, ref) => {
  const [count, setCount] = useState(0);

  useImperativeHandle(ref, () => ({
    increment() {
      setCount((prevCount) => prevCount + 1);
    },
    decrement() {
      setCount((prevCount) => prevCount - 1);
    },
  }));

  useEffect(() => {
    console.log(`Count changed to ${count}`);
  }, [count]);

  return <div>Count: {count}</div>;
});

依赖数组

useImperativeHandle 的第三个参数是一个依赖数组,与 useEffect 和 useMemo 中的依赖数组类似。这个依赖数组决定了何时重新创建暴露给父组件的实例方法。当依赖数组中的值发生变化时,useImperativeHandle 会重新执行。

const Child = forwardRef((props, ref) => {
  const [count, setCount] = useState(0);

  useImperativeHandle(
    ref,
    () => ({
      getCurrentCount() {
        return count;
      },
    }),
    [count]
  );

  return <div>Count: {count}</div>;
});

总结

useImperativeHandle 是一个强大的工具,允许我们更细粒度地控制组件的 ref 行为。虽然在日常开发中可能不常用,但在某些特定场景下,它提供了强大的功能。希望本文能帮助你更好地理解和使用这个 Hook。

标签:count,系列,useImperativeHandle,React,Child,组件,const,ref
From: https://blog.51cto.com/u_11365839/9240349

相关文章

  • AMD黑苹果运行Adobe系列软件处理方式
    AMD黑苹果运行Adobe系列软件处理方式前提条件需要安装了homebrew,安装homebrew可以参考本文章:Homebrew安装教程brewinstallnodejsnpminstall-gamdfriendsudoamdfriend--in-place--sign--directories软件路径example:sudoamdfriend--in-place--sign--directori......
  • React-hook-form-mui(一):基本使用
    前言在项目开发中,我们选择了React+MUI作为技术栈。在使用MUI构建form表单时,我们发现并没有与antd类似的表单验证功能,于是我们选择了MUI推荐使用的react-hook-form-mui库去进行验证。但是发现网上关于这个库的使用方法和demo比较少且比较简单,并没有复杂的表单验证的demo。因此本文及......
  • React 详解(1)
    React简介React基础JSX的本质JSX并不是标准的JS语法,它是JS的语法扩展,浏览器本身不能识别,需要通过解析工具做解析之后才能在浏览器中运行。这里主要依靠BABEL解析工具来解析,下面简单的介绍一下这个解析工具(http://babeljs.io):JSX中使用JS表达式在JSX中可以通过大括号语法......
  • 【愚公系列】2024年01月 WPF控件专题 Slider控件详解
    ......
  • .Net Core 系列: 集成 Consul 实现 服务注册与健康检查
    目录什么是Consul?安装和运行ConsulAsp.NetCore如何集成Consul实现服务注册和健康检查Consul.AspNetCore中的AddConsul和AddConsulServiceRegistration方法究竟做了什么?AddConsul方法AddConsulServiceRegistration方法配置Consul检查服务封装成扩......
  • .Net Core 系列: 集成 CORS跨域配置
    .NetCore系列:集成CORS跨域配置  目录什么是CORS?Asp.NetCore种如何配置CORS?CorsPolicyBuilder类详解注册以及使用策略三种方式EnableCors和DisableCors特性关于带证书与不带证书代码的实现跨源(cross-origin)不带请求证书(Credentials)跨源(cross-origi......
  • 算法练习题-系列一
    目录柯里化实现柯里化函数柯里化函数作用扁平化[双指针]有序数组合并判断一个字符串是否是回文字符串[字符串]两个版本号version1和version2[字符串]版本号大小比较排序['1.45.0','1.5','6','3.3.3.3.3.3.3']=>['1.5','1.45.0','3.3.3.3.3.3','6']给定两个......
  • 多种 React 组件通信方式实践
    使用ReactContext基于ReactContext实现跨组件通信的一个常见用例是创建一个能够在不同组件间共享和触发行为的上下文。以下是一个简化的例子,展示了如何在app.tsx中触发其他组件(例如,一个弹窗组件)中的方法。1.创建一个Context首先,我们创建一个新的Context。这个Context将......
  • Binder系列-5-binder_mmap—1—mmap()分析
    一、manmmap1.函数声明#include<sys/mman.h>void*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset);intmunmap(void*addr,size_tlength);intmsync(void*addr,size_tlength,intflags)作用:将文件或设备向内存中进行映射或取消映......
  • VB6的OfficeMenu控件 - 开源研究系列文章
          这次将原来VB6中喜欢和使用到的OfficeMenu的控件做一个使用介绍。      上次介绍了VB6中的控件引擎,但是那个只针对基本的控件,这个OfficeMenu控件在当时是收费的,笔者找度娘好不容易才下载到一个免费版本,而且使用起来也非常的方便,在当时那个年代是笔者对于VB6......