【问题标题】:TypeScript and React: Pass component in props and return it from a functionTypeScript 和 React:在 props 中传递组件并从函数中返回它
【发布时间】:2023-04-02 13:55:01
【问题描述】:

我正在使用 React 和 TypeScript 编写表单组件。我将 Formik 用于表单逻辑。我想将<Form /> 组件作为道具传递给特定的表单并渲染它。这是我尝试过的:

import { Formik, FormikProps } from "formik";
import React, { PureComponent, ReactNode } from "react";

export interface Props {
  component: ReactNode; // TODO: Change to one of LoginForm or RegisterForm.
  handleSubmit(): void;
}

export class Form extends PureComponent<Props> {
  renderForm = (formikProps: FormikProps<any>): ReactNode => {
    const { component: FormComponent } = this.props;
    return <FormComponent {...formikProps} />;
  };

  render() {
    const { handleSubmit } = this.props;
    return <Formik render={this.renderForm} />;
  }
}

export default Form;

问题是我返回&lt;FormComponent /&gt; 的行抛出错误:

[ts] JSX element type 'FormComponent' does not have any construct or call signatures.

renderForm 必须返回一个 ReactNode,所以我不能将 ReactNode 更改为 ComponentType(后者将解决 JSX 错误)。

如何在 TypeScript 中做到这一点?

编辑 所以我这样做了(感谢estus):

import { Formik, FormikProps } from "formik";
import React, { PureComponent, ReactElement } from "react";

export interface Props {
  component: React.ComponentType<any>; // TODO: Change to one of LoginForm or RegisterForm.
  handleSubmit(): void;
}

export class Form extends PureComponent<Props> {
  renderForm = (formikProps: FormikProps<any>): ReactElement<any> => {
    const { component: FormComponent } = this.props;
    return <FormComponent {...formikProps} />;
  };

  render() {
    const { handleSubmit } = this.props;
    return <Formik render={this.renderForm} />;
  }
}

export default Form;

【问题讨论】:

    标签: reactjs typescript typescript-typings react-props typescript-types


    【解决方案1】:

    ReactNode 是 React element 类型,而 component prop 应该是 React component

    应该是这样的:

    export interface Props {
      component: React.ComponentType;
      handleSubmit(): void;
    }
    

    renderForm 必须返回一个 ReactNode,所以我不能将 ReactNode 更改为 ComponentType(后者将解决 JSX 错误)。

    component prop 和 renderForm 返回类型未连接。前者是组件,后者是元素。

    【讨论】:

    • 嗨,estus,谢谢你再次帮助我?我在你回答后对帖子进行了编辑,我只是​​想知道你的回答是不是这个意思?
    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2020-10-07
    • 2019-06-23
    相关资源
    最近更新 更多