useImperativeHandle

useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值。在大多数情况下,应当避免使用 ref 这样的命令式代码。useImperativeHandle 通常与 forwardRef 一起使用。 如果只是获取子组件的某些属性、方法,则用useImperativeHandle就行,如果需要获取子组件中某些元素、组件实例、则必定需要forwardRef来实现透传。

父、子组件在使用该hook时步骤如下:

  1. 父组件使用useRef(或createRef)创建一个ref对象,将这个ref对象赋给子组件的ref属性
  2. 子组件使用forwardRef包装自己,允许作为函数组件的自己使用ref。然后使用useImperativeHandle钩子函数,在该钩子函数的第二个函数参数中返回一些状态或方法,这个被返回的状态或方法就可以被父组件访问到。
  3. 父组件使用创建的ref对象的current属性获取子组件暴露出的状态或方法。

示例代码如下:

import React, { useRef, useImperativeHandle } from 'react';
import ReactDOM from 'react-dom';
// 子组件:
const FancyInput = React.forwardRef((props, ref) => {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus();
      console.log('我聚焦了')
    }
  }));
  return <input ref={inputRef} type="text" />
});
// 父组件:
const App = props => {
  const fancyInputRef = useRef();
  return (
    <div>
      <FancyInput ref={fancyInputRef} />
      <button
        onClick={() => fancyInputRef.current.focus()}      // 调用子组件的方法
      >父组件调用子组件的 focus</button>
    </div>
  )
}
ReactDOM.render(<App />, root);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容