gpt4 book ai didi

reactjs - 如何使用带有 typescript 的 Ant 设计表单正确验证和提交表单是否有效

转载 作者:行者123 更新时间:2023-12-04 01:42:39 25 4
gpt4 key购买 nike

我用 react、redux、typescript ant design 构建了一个简单的表单。根据 ant design 文档,我使用提供的 getFieldDecorator 创建了一个小表单和 Form.create方法。到目前为止一切正常,在将数据输入字段时验证由 ant design 本身处理。我的主要问题是表单提交。我只想在表单经过验证并且表单因此“有效”时才提交数据。

官方文档使用validateFields验证表单并返回一个包含错误的变量并返回进一步的执行,以便表单不会被提交。现在使用 typescript 我有以下签名: validateFields(): void; <- 我使用此方法在提交表单时触发验证,然后调用 getFieldsError(names?: Array<string>): Record<string, string[] | undefined>;

现在,如果您查看示例代码,丑陋的部分是使用变量“allValid”来检查表单是否有效。我认为如果表单有效,则必须有一种更简单的方法来验证和提交数据。

const UploadForm: FunctionComponent<FormComponentProps> = props => {
const { getFieldDecorator, validateFields, getFieldsError } = props.form;
const dispatch = useDispatch();

return (
<Form
{...formItemLayout}
onSubmit={event => {
event.preventDefault();
validateFields();
const validationErrors = getFieldsError();
let allValid = true;
console.log(validationErrors);
for (let key in validationErrors) {
console.log(validationErrors[key]);
if (validationErrors[key] !== undefined) {
allValid = false;
break;
}
}

if (allValid) {
dispatch(submitFormData());
}
}}
>
<ImageComponent />
<Form.Item label="E-mail">
{getFieldDecorator("email", {
rules: [
{
type: "email",
message: "The input is not valid E-mail!"
},
{
required: true,
message: "Please enter your E-mail!"
}
]
})(
<Input
prefix={<Icon type="mail" style={{ color: "rgba(0,0,0,.25)" }} />}
placeholder="Your e-mail"
/>
)}
</Form.Item>
<Form.Item {...buttonItemLayout}>
<Button type="primary" htmlType="submit">
Submit
</Button>
</Form.Item>
</Form>
);
};

export default Form.create < FormComponentProps > {}(UploadForm);

最佳答案

您可以使用 Object.values()Array.find()找到 undefined 值。

validateFields();
const validationErrors = Object.values(getFieldsError());

if (!validationErrors.find(e => e === undefined)) dispatch(submitFormData());

或者您可以禁用提交按钮

验证每个Form.Item,只有当所有验证状态都为success时才允许提交。

<Button
type="primary"
htmlType="submit"
disabled={!(validateEmptyField(name) && validateEmptyField(surName))}
>
Submit
</Button>;

使用validateStatus 验证每个Form.Item:

function FromValidate() {
const [name, setName] = useState('');
const [surName, setSurName] = useState('');

return (
<Flexbox>
<Form
onSubmit={e => {
e.preventDefault();
console.log('name', name);
console.log('surName', surName);
}}
>
<Form.Item
label="Name"
required={true}
validateStatus={validateEmptyField(name) ? 'success' : 'error'}
help={!validateEmptyField(name) && 'Name cannot be empty'}
>
<Input
placeholder="Unique Identifier"
value={name}
onChange={e => setName(e.target.value)}
/>
</Form.Item>
...
<Form.Item>
<Button
type="primary"
htmlType="submit"
disabled={
!(validateEmptyField(name) && validateEmptyField(surName))
}
>
Submit
</Button>
</Form.Item>
</Form>
</Flexbox>
);
}

Edit Form-Validate

关于reactjs - 如何使用带有 typescript 的 Ant 设计表单正确验证和提交表单是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56715594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com