:::info useImperativeHandle hook与useRef、forwardRef需要搭配使用。 :::

1、具体的使用案例

  1. import React, { forwardRef, useRef, useImperativeHandle } from 'react';
  2. const Childcpn = forwardRef((props, ref) => {
  3. // 组建内部的逻辑
  4. const inputRef = useRef();
  5. // 处理相应的逻辑 这个的ref是父组件传过来的
  6. useImperativeHandle(ref, () => ({
  7. // 这个回调函数 定义了什么函数 在父组件中只能用回调函数 相当于只给父组件暴露一个方法。
  8. focus: () => {
  9. // 操作组件内部的属性
  10. inputRef.current.focus()
  11. }
  12. }), [inputRef.current])
  13. return (
  14. <>
  15. <input ref={ inputRef } type="text" />
  16. </>
  17. )
  18. })
  19. export default function UseImperativeHandleHookDemo() {
  20. // 组件内部的属性
  21. const childRef = useRef()
  22. // 定义组件本身的行为
  23. function handleClick() {
  24. childRef.current.focus()
  25. }
  26. return (
  27. <>
  28. <Childcpn ref={ childRef }/>
  29. <button onClick={ handleClick }>按钮</button>
  30. </>
  31. );
  32. }

2、原理解析

:::info

  • 我们并不希望在父组件中直接对子元素所有的属性进行控制,对子元素的相关操纵,应该是由子组件自己预先定义好,只是把相应得函数或者方法传递给父组件,让父组件调用相关得函数或者方法,那么我们的子组件就是可控的,并不能设计为父元素很容易的控制子元素。
  • 核心思想—父组件想操作子组件的属性,应该预先由子组件定义好属性或者方法,只提供给父组件使用,而不用过多的暴露子组件本身的方法与属性。处于安全性与可控性的角度进行考虑。 :::