gpt4 book ai didi

reactjs - 在 TypeScript 的 Formik 验证中分配错误消息不起作用

转载 作者:行者123 更新时间:2023-12-05 01:35:43 24 4
gpt4 key购买 nike

此时我正在尝试构建一个用户输入表单,用户应该在其中输入姓名、电子邮件和密码,使用 React 和 TypeScript 中的 Formik

处理输入本身工作正常,现在我想为输入表单添加验证功能,所以我编写了如下代码。

import { Formik, Form, Field, ErrorMessage } from 'formik'; 

validate(values: User){
let errors: User;
errors = values
if(!values.password){
errors.password = 'Enter a password'
} else if(values.password.length < 8){
errors.password = 'Enter at least 8 characters for your password'
}
console.log("The length of errors.password: " + values.password.length);

return errors;
}

return(
<div>
<Formik
initialValues={{ name, email, password }}
onSubmit={this.onSubmit}
validate={this.validate}
enableReinitialize={true}
>
{
(props) => (
<Form>
<fieldset>
<label>Name</label>&nbsp;
<Field type="text" name="name"/>
</fieldset>
<fieldset>
<label>Email</label>&nbsp;
<Field type="text" name="email"/>
</fieldset>
<ErrorMessage name="password" component="div"/>
<fieldset>
<label>Password</label>&nbsp;
<Field type="password" name="password"/>
</fieldset>
<button type="submit">Save</button>
</Form>
)
}
</Formik>
</div>
)

我想根据用户输入的密码长度是否足够长来显示错误消息,但即使密码太短也不会显示错误消息。

我在 validation 方法中添加了一个 console.log 并确保调用了该方法。当密码足够长时,比如 12 个字符长,部分

console.log("The length of errors.password: " + values.password.length);

被调用并显示密码的长度,但是当长度变得小于 8 时,而不是将字符串 'Enter at least 8 characters for your password' 分配给 errors.password,出现警告。

Warning: An unhandled error was caught during low priority validation in <Formik validate /> TypeError: Cannot set property 'password' of undefined

我查看了多个 GitHub 页面和 Stack Overflow 帖子,但没有找到似乎与我的问题相关的内容。

我做错了什么?

相同的代码在 JavaScript 中运行良好,因为我当前的版本是 TypeScript 可能我缺少某些东西?

最佳答案

看起来 undefined 在 Formik 的内部验证循环中的某个时刻作为参数传递给 validate。我建议更改此行:

let errors: User;
errors = values; // why are you assigning your error object to the values?

为此:

let errors: Partial<User> = {};

我不确定您为什么要将当前值分配给错误对象。如果没有错误,errors 应该是一个空对象 ({})。

使用新方法,您仍然可以获得类型安全,因为您无法将属性分配给用户类型中不存在的 errors:

errors.password = "Password too short"; // this is fine
errors.foo = "asdf"; // TypeError - No property "foo" in type "User"

关于reactjs - 在 TypeScript 的 Formik 验证中分配错误消息不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62761675/

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