我有自己的Form
组件,我希望将其与Parent Component
分开。
const Form: React.FC<any> = ({ children, handleFormSubmit }) => (
<form onSubmit={handleFormSubmit}>{children}</form>
);
Parent Component
const ParentComponent = () => {
...
const handleFormSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
publishReview(review).then(() => setReview(initialReviewState));
};
return (
<Form onSubmit={handleFormSubmit}>
...
</Form>
)}
我以为handleFormSubmit
会从它的声明const handleFormSubmit = (event: React.FormEvent<HTMLFormElement>)
中获取类型。
但事实并非如此
我尝试过构建一个接口,甚至是any
类型:
interface FormProps {
handleFormSubmit: any
}
const Form: React.FC<FormProps>= ({ children, handleFormSubmit }) => (
<form onSubmit={handleFormSubmit}>{children}</form>
);
但它给出了以下错误:
const Form: React.FunctionComponent<FormProps>
Type '{ children: Element; onSubmit: (event: FormEvent<HTMLFormElement>) => void; }' is not assignable to type 'IntrinsicAttributes & FormProps & { children?: ReactNode; }'.
Property 'onSubmit' does not exist on type 'IntrinsicAttributes & FormProps & { children?: ReactNode; }'.
6条答案
按热度按时间62lalag41#
这对我很有效。只是根据你的猜测猜测。谢谢!
qni6mghb2#
你需要指定表单元素的类型,比如在表单中你有一个id为
yourInputName
的输入:在你的
handleSubmit
中,你需要指定event.currentTarget
的类型。一个表单标签有一个HTMLFormElement
的类型和一个elements
的属性,它们是HTMLFormControlsCollection
的类型,但是我们可以覆盖它来告诉TS我们的输入是什么。创建一个扩展HTMLFormControlsCollection
的接口,指定字段的类型,然后使用自定义接口覆盖HTMLFormElement
中的elements属性。然后将新类型传递给处理函数
现在您可以访问字段的值,并且typescript将知道它是什么
如果您将鼠标悬停在
value
上,TS应该显示一条消息,指出数据类型是HTMLInputElement.value: string
,正如您在FormElements
界面中指定的那样。axkjgtzd3#
cvxl0en24#
你的 prop 名称有个错误。你看到错配了吗?
Form
组件接受名为handleFormSubmit
的属性,但您使用名为onSubmit
的属性调用它。**您需要更改其中一个位置的名称以使它们匹配,或者调用
<Form handleFormSubmit={handleFormSubmit}>
,或者更改Form
组件的props以使prop命名为onSubmit
。下面是如果将prop重命名为
onSubmit
并为其指定正确的类型而不是any
时的外观。如果像这样定义
Form
,则不需要对ParentComponent
进行任何更改。sycxhyv75#
正如Ivo所写的,但如果您想正确地使用
type
键入它:qnzebej06#
如果您在React中有不受控制表单(我使用了MUI字段):
你可以这样做:
};灵感源自here