React useImperativeHandle Hook

简介: 【7月更文挑战第1天】React useImperativeHandle Hook

useImperativeHandle Hook 是一个比较比较简单的 hook,为 ref 节点添加一些处理方法,下面是来自官网例子,为 ref 添加了两个方法。

import { forwardRef, useRef, useImperativeHandle } from 'react';

const MyInput = forwardRef(function MyInput(props, ref) {
const inputRef = useRef(null);

useImperativeHandle(ref, () => {
return {
focus() {
inputRef.current.focus();
},
scrollIntoView() {
inputRef.current.scrollIntoView();
},
};
}, []);

return ;
});

export default MyInput;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
React 框架中对应的代码实现,代码实现比较简单,在绑定阶段mountImperativeHandle 方法中调用

返回值绑定在 ref.current 属性上,最后返回一个清理 ref.current 的方法。

在React中,useImperativeHandle Hook 允许父组件访问并调用子组件中的某些方法或属性,从而实现自定义的交互逻辑。这对于需要直接操作子组件内部状态或功能的场景非常有用,尤其是那些使用了高阶组件、渲染道具(render props)或forwardRef的情况。

如果你想要通过一个ref转发多个方法或属性,可以通过创建一个对象,将这些方法或属性作为对象的键值对,然后将这个对象传递给useImperativeHandle。下面是一个简单的示例:

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

// 子组件
const Child = forwardRef((props, ref) => {
  const childRef = useRef();

  // 定义你想暴露给父组件的方法或属性
  const methodOne = () => {
    console.log("Method One called");
  };

  const methodTwo = (value) => {
    console.log(`Method Two called with value: ${value}`);
  };

  // 使用 useImperativeHandle 来暴露方法
  useImperativeHandle(ref, () => ({
    // 你可以在这里返回任何你希望父组件能访问到的方法或属性
    methodOne,
    methodTwo,
  }));

  return (
    <div>
      <h3>Child Component</h3>
    </div>
  );
});

// 父组件
const Parent = () => {
  const childRef = useRef();

  const callMethodsFromChild = () => {
    childRef.current.methodOne();
    childRef.current.methodTwo("Hello from Parent");
  };

  return (
    <div>
      <h2>Parent Component</h2>
      <button onClick={callMethodsFromChild}>Call Child Methods</button>
      <Child ref={childRef} />
    </div>
  );
};

export default Parent;

在这个例子中,Child组件通过forwardRef接收一个ref,并使用useImperativeHandle来暴露methodOnemethodTwo两个方法。在Parent组件中,我们通过这个ref调用子组件的方法,实现了跨组件的直接交互。
总结

相关文章
|
2月前
|
前端开发
React 中的 Hook 概念
【8月更文挑战第31天】
22 0
|
3月前
|
前端开发 JavaScript 数据格式
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
63 1
|
3月前
|
前端开发
Vue3 【仿 react 的 hook】封装 useTitle
Vue3 【仿 react 的 hook】封装 useTitle
30 0
|
3月前
|
前端开发 API
Vue3 【仿 react 的 hook】封装 useLocation
Vue3 【仿 react 的 hook】封装 useLocation
26 0
|
5月前
|
前端开发 JavaScript
【边做边学】React Hooks (二)——useEffect Hook
【边做边学】React Hooks (二)——useEffect Hook
|
5月前
|
前端开发 JavaScript
React中useEffect Hook使用纠错
React中useEffect Hook使用纠错
32 0
|
5月前
|
自然语言处理 前端开发 JavaScript
说说你对 React Hook的闭包陷阱的理解,有哪些解决方案?
说说你对 React Hook的闭包陷阱的理解,有哪些解决方案?
97 0
|
10月前
|
自然语言处理 前端开发 JavaScript
美丽的公主和它的27个React 自定义 Hook(四)
美丽的公主和它的27个React 自定义 Hook(四)
|
10月前
|
存储 前端开发 数据可视化
美丽的公主和它的27个React 自定义 Hook(三)
美丽的公主和它的27个React 自定义 Hook(三)
|
2月前
|
前端开发 JavaScript UED
React 基础与实践 | 青训营笔记
React 基础与实践 | 青训营笔记
44 0
下一篇
无影云桌面