我正在使用 React 和 TypeScript 编写一个表单组件。我将 Formik 用于表单逻辑。我想通过 <Form />
组件一个特定的形式作为 Prop 并渲染它。这是我尝试过的:
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;
问题是我返回 <FormComponent />
的行抛出错误:
[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;
最佳答案
ReactNode
是 React element 类型,而 component
prop 应该是 React component。
它可能应该是:
export interface Props {
component: React.ComponentType;
handleSubmit(): void;
}
renderForm has to return a ReactNode, so I can't change ReactNode to ComponentType (the latter would resolve the JSX error).
component
prop 和 renderForm
返回类型没有关联。前者是组件,后者是元素。
关于reactjs - typescript 和 react : Pass component in props and return it from a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53289525/