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

 更新时间:2022年08月08日 09:40:20   作者:我们都是柠檬精诶  
这篇文章主要介绍了react中的useImperativeHandle()和forwardRef()用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、useImperativeHandle()

useImperativeHandle(ref, createHandle, [deps])

useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值。在大多数情况下,应当避免使用 ref

这样的命令式代码。 useImperativeHandle 应当与 forwardRef 一起使用。

function FancyInput(props, ref) {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus();
    }
  }));
  return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);

在本例中,渲染 的父组件可以调用 inputRef.current.focus()。

二、forwardRef()

React.forwardRef 会创建一个React组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。

这种技术并不常见,但在以下两种场景中特别有用:

(1)转发 refs 到 DOM 组件

(2)在高阶组件中转发 refs

React.forwardRef 接受渲染函数作为参数。React 将使用 props 和 ref 作为参数来调用此函数。此函数应返回 React 节点。 FancyButton 使用 React.forwardRef 来获取传递给它的 ref,然后转发到它渲染的 DOM button。这样,使用 FancyButton 的组件可以获取底层 DOM 节点 button 的 ref,并在必要时访问,就像其直接使用 DOM button 一样。

const FancyButton = React.forwardRef((props, ref) => (   // Step:3
  <button ref={ref} className="FancyButton">    // Step:4
      {props.children}
  </button>
));
const ref = React.createRef(); // Step:1
<FancyButton ref={ref}>Click me!</FancyButton>; // Step:2

在上述的示例中,React 会将 <FancyButton ref={ref}> 元素的 ref 作为第二个参数传递给 React.forwardRef 函数中的渲染函数。该渲染函数会将 ref 传递给 <button ref={ref}> 元素。 因此,当React 附加了 ref 属性之后,ref.current 将直接指向 <button> DOM 元素实例。 欲了解更多相关信息,请参阅官档 refs 转发。

以下是对上述示例发生情况的逐步解释:(转发 refs 到 DOM 组件)

  • 我们通过调用 React.createRef 创建了一个 React ref 并将其赋值给 ref 变量。
  • 我们通过指定 ref 为JSX 属性,将其向下传递给 <FancyButton ref={ref}>。
  • React 传递 ref 给 forwardRef 内函数 (props, ref) => ...,作为其第二个参数。
  • 我们向下转发该 ref 参数到 <button ref={ref}>,将其指定为 JSX 属性。
  • 当 ref 挂载完成,ref.current 将指向 <button> DOM 节点。

三、案例

父组件

1、注册

2、定义

3、触发

子组件

1、暴露子组件方法,将 forwardRef 接受的 ref 属性转发到其组件树下的另一个组件中

(1)

(2)

(3)父组件

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • React受控组件与非受控组件实例分析讲解

    React受控组件与非受控组件实例分析讲解

    具体来说这是一种react非受控组件,其状态是在input的react内部控制,不受调用者控制。可以使用受控组件来实现。下面就说说这个React中的受控组件与非受控组件的相关知识,感兴趣的朋友一起看看吧
    2023-01-01
  • react 下拉框内容回显的实现思路

    react 下拉框内容回显的实现思路

    这篇文章主要介绍了react 下拉框内容回显,实现思路是通过将下拉框选项的value和label一起存储到state中, 初始化表单数据时将faqType对应的label查找出来并设置到Form.Item中,最后修改useEffect,需要的朋友可以参考下
    2024-05-05
  • 教你使用vscode 搭建react-native开发环境

    教你使用vscode 搭建react-native开发环境

    本文记录如何使用vscode打造一个现代化的react-native开发环境,旨在提高开发效率和质量。本文给大家分享我遇到的问题及解决方法,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • React使用React.lazy和Suspense实现组件懒加载

    React使用React.lazy和Suspense实现组件懒加载

    React 提供了 React.lazy 和 Suspense 这两个好东西,能让我们实现组件的懒加载,下面就跟随小编一起来了解一下如何使用它们实现懒加载的具体步骤吧
    2025-03-03
  • 三分钟搞懂react-hooks及实例代码

    三分钟搞懂react-hooks及实例代码

    React Hooks是今年最劲爆的新特性真的毫不夸张。如果你也对react感兴趣,或者正在使用react进行项目开发,请抽出点时间阅读下此文
    2022-03-03
  • React重新渲染超详细讲解

    React重新渲染超详细讲解

    什么是re-render(重新渲染)?哪些是必要的re-render?哪些是非必要的re-render?如果你对这些问题还不是很明白,那么可以在这篇文章中找到答案
    2022-11-11
  • react-diagram 序列化Json解读案例分析

    react-diagram 序列化Json解读案例分析

    今天带来大家学习react-diagram 序列化Json解读的相关知识,本文通过多种案例给大家分析序列化知识,通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2021-05-05
  • React Hooks: useEffect()调用了两次问题分析

    React Hooks: useEffect()调用了两次问题分析

    这篇文章主要为大家介绍了React Hooks: useEffect()调用了两次问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • react中useRef的应用使用详解

    react中useRef的应用使用详解

    这篇文章主要介绍了react中useRef的应用使用详解的相关资料,需要的朋友可以参考下
    2023-05-05
  • react无限滚动组件的实现示例

    react无限滚动组件的实现示例

    本文主要介绍了react无限滚动组件的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论