useImperativeHandle 用于自定义暴露给父组件的实例值,配合 forwardRef 使用。

useImperativeHandle Hook 详解

useImperativeHandle 用于自定义暴露给父组件的实例值,配合 forwardRef 使用。

// 基本语法

const CustomInput = forwardRef((props, ref) => {
  const inputRef = useRef(null);

  useImperativeHandle(ref, () => ({
    focus: () => inputRef.current?.focus(),
    clear: () => { /* ... */ }
  }));

  return <input ref={inputRef} {...props} />;
});

示例 1: 基础用法

暴露的方法:

  • focus() - 聚焦输入框
  • clear() - 清空内容
  • getValue() - 获取当前值
  • setValue(value) - 设置值

示例 2: 表单验证

说明: 父组件通过 ref 调用子组件的 validate() 方法进行验证

示例 3: 模态框控制

优势:

  • 父组件不需要管理 isOpen 状态
  • 通过 ref 命令式控制打开/关闭
  • 可以有多个独立的模态框实例

示例 4: 视频播放器

0:000:00

何时使用 useImperativeHandle?

✅ 适合使用

  • 需要暴露命令式 API
  • 隐藏内部实现细节
  • 复杂组件(视频、音频、画布)
  • 表单验证组件

❌ 不推荐使用

  • 可以用 props 传递的场景
  • 简单的 DOM 操作
  • 状态可以提升到父组件时