https://zh-hans.reactjs.org/docs/forwarding-refs.html
https://tsejx.github.io/react-guidebook/api-reference/react/forward-ref/

子组件

  1. import {forwardRef} from 'react';
  2. const InputForward = forwardRef((props, ref) => {
  3. return (
  4. <Input ref={ref}/>
  5. )
  6. });
  7. export default InputForward;

父组件

  1. import InputForward from './InputForward';
  2. function App() {
  3. const inputRef = useRef();
  4. return (<InputForward ref={inputRef}/>)
  5. }

应用场景:

  • 封装的组件库,获取hooks函数组件引用
  • ref不能通过 props作为参数可以传递,所以要想传递 ref得用forwardRef
    • 当 React 附加了 ref 属性之后,ref.current 将直接指向 DOM 元素实例
  • ref 的作用是获取实例,可能是 DOM 实例,也可能是 ClassComponent 的实例
  • 如果获取的组件是一个 FunctionComponent 的话,是没有实例的(PureComponent),此时用 ref 去传递会报错

image.png

props 不能传递 ref

用 ref 获取子组件,也可以理解为子组件向父组件暴露 DOM 引用。
只有 FunctionComponent 才用得到 forwardRef,ClassComponent 不需要
https://zh-hans.reactjs.org/docs/forwarding-refs.html
image.png

forwardRef 包裹的组件,导出类型为 object

  1. const SelectRef = forwardRef(PlanSelect);
  2. export default SelectRef;
  3. // typeof SelectRef object

控制台报错 React.forwardRef

原因:使用了connect方法,在connect第四个参数,设置在父组件中使用ref
image.png

子组件用 forwardRef包裹

FormRef.js

  1. import React, { forwardRef } from 'react'
  2. const FormRef = forwardRef((props, ref) => {
  3. return <input ref={ref}/>
  4. });
  5. export default FormRef;

父组件调用时,传递 ref属性

  1. import { useRef } from 'react';
  2. import Form from './FormRef';
  3. function App() {
  4. const formRef = React.useRef()
  5. return (
  6. <Form ref={formRef}/>
  7. )
  8. }

redux 中的 connect 方法将组件包装成高阶组件(HOC),那么我如何通过 ref 去获取包装前的组件实例?

useImperativeHandle

https://juejin.cn/post/6968664212348338206
只暴露特定的方法,没有用 useImperativeHandle会获取整个实例的方法和属性

updateForwardRef

更新 ref指向,及被 React.forwardRef包裹的 FunctionComponent