关于react.js:重学React-React-Hooks之useImperativeHandle

前提知识点

useImperativeHandle常与forwardRefref一起应用,所以须要了解后两者的根底用法。能够通过以下两个示例代码,疾速理解refforwardRef的应用办法。

  • Demo1: 在Class和Functional函数中应用ref .该示例展现了ref的用法,同时表明不通过forwardRef封装的子组件,无奈将ref传给父组件。
  • Demo2: farwardRef转发ref.该示例展现了farwardRef的用法,父组件ForwardButton胜利获取到子组件RefInFunctionalComponentref

useImperativeHandle

官网说

useImperativeHandle customizes the instance value that is exposed to parent components when using ref

怎么了解呢?

当父组件通过forwardRef属性,失去子组件的ref时,它只失去一个可读的对象。而useImperativeHandle配合forwardRef来应用,则给予了批改ref的能力,比方为ref减少自定义办法。

这种在父组件中间接调用子组件ref函数的办法,一点都不React,所以React并不举荐。然而为了不便第三方库的开发,则须要提供这种自定义ref的能力。

咱们在Demo2的根底上批改一下代码,看看useImperativeHandle如何工作。

批改子组件RefInFunctionalComponent,新增useImperativeHandle代码块,自定义getContent办法,如下:

const RefInFunctionalComponent = (props, ref) => {
  const innerRef = useRef(null)
  useImperativeHandle(ref, () => ({
    getContent: () => innerRef.current.innerText
  }))
  const handleClick1 = () => {
    console.log(ref.current.innerText)
  }
  return <button ref={innerRef} onClick={handleClick1}>{props.children}</button>
}
const ForwardButton = forwardRef(RefInFunctionalComponent)

在父组件中应用ForwardButton:

const App = () => {
  const ref = useRef(null)
  const handleClick = () => {
    console.log(ref.current.getContent()) // 按钮1
  }
  return (
    <div className="wrapper">
      <ForwardButton ref={ref}>按钮1</ForwardButton>
      <button onClick={handleClick}>获取button1</button>
    </div>
  );
};

Demo3:残缺示例代码。

参考

  • When to use useImperativeHandle

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理