Sea*_*014 3 validation typescript reactjs formik
目前,我正在尝试构建一个用户输入表单,用户应该Formik在 React 和 TypeScript 中使用输入姓名、电子邮件和密码。
处理输入本身工作正常,现在我想向输入表单添加验证功能,所以我编写了如下代码。
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>
<Field type="text" name="name"/>
</fieldset>
<fieldset>
<label>Email</label>
<Field type="text" name="email"/>
</fieldset>
<ErrorMessage name="password" component="div"/>
<fieldset>
<label>Password</label>
<Field type="password" name="password"/>
</fieldset>
<button type="submit">Save</button>
</Form>
)
}
</Formik>
</div>
)
Run Code Online (Sandbox Code Playgroud)
我想根据用户输入的密码是否足够长来显示错误消息,但即使密码太短也不会显示错误消息。
我console.log在validation方法中添加了 a 并确保调用了该方法。当密码足够长时,例如 12 个字符长,该部分
console.log("The length of errors.password: " + values.password.length);
Run Code Online (Sandbox Code Playgroud)
调用并显示密码的长度,但是当长度小于 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
Run Code Online (Sandbox Code Playgroud)
我查看了几个 GitHub 页面和 Stack Overflow 帖子,但没有找到似乎与我的问题相关的页面。
我究竟做错了什么?
相同的代码在 中运行良好JavaScript,因为我当前的版本TypeScript可能缺少一些东西?
它看起来像是在 Formik 内部验证循环期间的某个时刻undefined作为参数传递的。validate我建议更改此行:
let errors: User;
errors = values; // why are you assigning your error object to the values?
Run Code Online (Sandbox Code Playgroud)
对此:
let errors: Partial<User> = {};
Run Code Online (Sandbox Code Playgroud)
我不确定您为什么要将当前值分配给错误对象。如果没有错误,errors应该是一个空对象 ( {})。
使用新方法,您仍然可以获得类型安全,因为您无法将属性分配给errorsUser 类型中不存在的属性:
errors.password = "Password too short"; // this is fine
errors.foo = "asdf"; // TypeError - No property "foo" in type "User"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8575 次 |
| 最近记录: |