react hook: useimperativeHandle

通过 useImperativeHandle,子组件可以选择性地暴露给父组件某些属性或方法,而不是将所有属性和方法暴露出去。

父组件 获得自组件的 ref,就能通过该 ref 来调用 focus来聚焦等功能

在 forwardRef 包装的组件中,ref 固定地是第二个参数,而第一个参数是这个组件接受的 props。这是 React 为了确保 forwardRef 正确工作而规定的。所以在这种情况下,ref 必须放在第二个参数的位置。

javascript 复制代码
app.js

import { useRef } from 'react';
import MyInput from './MyInput.js';

export default function Form() {
  const ref = useRef(null);

  function handleClick() {
    ref.current.focus();
    // 下方代码不起作用,因为 DOM 节点并未被暴露出来:
    // ref.current.style.opacity = 0.5;
  }

  return (
    <form>
      <MyInput placeholder="Enter your name" ref={ref} />
      <button type="button" onClick={handleClick}>
        Edit
      </button>
    </form>
  );
}


myInput.js

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 <input {...props} ref={inputRef} />;
});

export default MyInput;

不要滥用 ref。 你应当仅在你没法通过 prop 来表达 命令式 行为的时候才使用 ref:例如,滚动到指定节点、聚焦某个节点、触发一次动画,以及选择文本等等。
如果可以通过 prop 实现,那就不应该使用 ref。例如,你不应该从一个 Model 组件暴露出 {open, close} 这样的命令式句柄,最好是像 这样,将 isOpen 作为一个 prop。副作用 可以帮你通过 prop 来暴露一些命令式的行为。

相关推荐
慧一居士几秒前
Nuxt4 项目的约定配置都有哪些,哪些可以自动实现, 详细示例和使用说明
前端·vue.js
芯智工坊2 分钟前
每周一个开源项目 #4:ChatGPT-Next-Web 增强版
前端·chatgpt·开源
左右用AI6 分钟前
每周1亿次下载的axios被投毒了,但是源码里没有一行恶意代码!
前端·后端
英俊潇洒美少年11 分钟前
前端模块化 AMD、CMD、CommonJS、ESM的差异对比
前端
攀登的牵牛花14 分钟前
Claude Code 泄露事件复盘:前端发布流程哪里最容易翻车
前端·github·claude
D_C_tyu22 分钟前
vue3 + vue3-print-nb 插件实现打印功能
前端·javascript·vue.js
paul_chen2123 分钟前
Vite + Vue SPA 在子路径部署(内外网访问+Nginx 反向代理)
前端·vue.js·nginx
星如雨グッ!(๑•̀ㅂ•́)و✧24 分钟前
Reactor背压
java·服务器·前端
笑笑先生31 分钟前
从接口搬运工到研发控制平面,BFF 到底在解决什么?
前端·架构·node.js
霪霖笙箫32 分钟前
「JS全栈AI Agent学习」二、反思、工具使用、规划——让 Agent 从"执行者"变成"自主完成者"
前端·agent·ai编程