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 将使用 propsref 作为参数来调用此函数。此函数应返回 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 组件)

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

三、案例

父组件
1、注册
在这里插入图片描述
2、定义
在这里插入图片描述
3、触发
在这里插入图片描述
子组件

1、暴露子组件方法,将 forwardRef 接受的 ref 属性转发到其组件树下的另一个组件中
在这里插入图片描述
(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)父组件
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
useImperativeHandleReact的一个自定义Hook函数,它可以在使用ref时自定义暴露给父组件的实例值。通常情况下,我们应该避免使用ref这样的命令式代码,而是使用更加声明式的方法进行组件间的通信。然而,在某些情况下,我们可能需要在父组件中获取子组件的一些内部状态或方法,这时就可以使用useImperativeHandle配合forwardRef来实现这个功能。 useImperativeHandle的使用方法如下: ```javascript useImperativeHandle(ref, createHandle, [deps]) ``` 其中,ref是一个React引用对象,createHandle是一个函数,用于定义要暴露给父组件的实例值,deps是一个可选的依赖数组。 在父组件中,可以通过ref来获取子组件内部暴露的实例值,从而实现父子组件之间的通信。通过useImperativeHandle,父组件可以一次性获取到多个标签元素或其他子组件内部的状态或方法。 在子组件中,需要使用React的useState、useImperativeHandle等Hook函数来定义内部状态或实例值,并将其暴露给父组件使用。在useImperativeHandle中,可以返回一个对象,该对象包含了需要暴露给父组件的实例值。 总而言之,useImperativeHandle是一个可以让父组件获取子组件内部状态或方法的自定义Hook函数,通过配合forwardRef使用,可以实现父子组件之间的通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [useImperativeHandle使用实例](https://blog.csdn.net/WJLcomeon/article/details/123246152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [前端必读2.0:如何在React 中使用SpreadJS导入和导出 Excel 文件](https://blog.csdn.net/web22050702/article/details/127797298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值