Better

Ethan的博客,欢迎访问交流

how to use React.forwardRef in TypeScript

最近在 TypeScript 中使用 forwardRef 时,类型总是报错,往往最终得搬出 any 大法,但是内心总是有点不爽,这里记录在函数式组件和类组件中,该如何正确使用 forwardRef。

函数式组件

在函数式组件中,forwardRef 需要搭配 useImperativeHandle hooks 使用。其实类型出错的原因就在于需要使用 React.Ref 将类型声明一下,例子如下

import React, { forwardRef, useImperativeHandle, useRef, Ref } from "react";

type CustomInputProps = {
  label: string;
};

type RefDataType = HTMLInputElement | null;

function CustomInput(props: CustomInputProps, ref: Ref<RefDataType>) {
  const inputRef = useRef<HTMLInputElement | null>(null);

  // 自定义你需要暴露给父组件的对象,这里直接将 input 暴露出去了
  useImperativeHandle(ref, () => inputRef.current);

  return (
    <div>
      <span>{props.label}:</span>
      <input ref={inputRef} />
    </div>
  );
}

export default forwardRef<RefDataType, CustomInputProps>(CustomInput);

上面使用 useImperativeHandle 可以自定义需要暴露的元素,上述例子也可以简写为。???update at 20200613 这个例子好像有问题!!!咋么肥事

type RefDataType = HTMLInputElement;

type CustomInputProps = {
  label: string;
};

function CustomInput(props: CustomInputProps, ref: Ref<RefDataType>) {
  return (
    <div>
      <span>{props.label}:</span>
      <input ref={ref} />
    </div>
  );
}

类组件

直接上例子

type RefDataType = HTMLInputElement;

type CustomInputProps = {
  label: string;
  forwardRef: Ref<RefDataType>;
};

class CustomInput extends Component<CustomInputProps> {
  render() {
    return (
      <div>
        <span>{this.props.label}:</span>
        <input ref={this.props.forwardRef} />
      </div>
    );
  }
}

export default forwardRef<RefDataType, CustomInputProps>((props, ref) => (
  <CustomInput {...props} forwardRef={ref} />
));


留言