【发布时间】:2018-12-14 20:26:34
【问题描述】:
我为用户名和密码制作了一个反应表单,并有一个正则表达式表单来验证它们。
我有一个设置状态,首先设置值,然后我将回调传递给 setState 以验证用户名是否正确。
onChange={(e) => this.setState({username: e.target.value}, this.usernameValidator(this.state.username))}
我使用 setState 回调,因为我知道每次更改都会调用它,我不确定是否应该单独调用该方法?
这是我的处理程序
usernameValidator = (username) =>{
var usernameRegex = /^[a-zA-Z0-9]+([a-zA-Z0-9](_|-| )[a-zA-Z0-9])*[a-zA-Z0-9]+$/;
if(usernameRegex.test(username)){
this.setState({
isUsernameCorrect: true
})
}else{
this.setState({
isUsernameCorrect: false
})
}
console.log(this.state.isUsernameCorrect)
}
我的问题是,每当用户输入例如 5 个字符(可传递给正则表达式模式),然后将任意数量的字符删除为不可接受的数字时,正则表达式模式仍然会通过。
怎么会这样,我的意思是onChange,也应该检查删除,然后处理程序会再次验证?
编辑:
在 cmets 之后,说这是我尝试的问题是正则表达式模式,使用一些控制台日志来查找当前状态的值,当它被验证时
usernameValidator = (username) =>{
var usernameRegex = /^[a-zA-Z0-9]+([a-zA-Z0-9](_|-| )[a-zA-Z0-9])*[a-zA-Z0-9]+$/;
if(usernameRegex.test(username)){
this.setState({
isUsernameCorrect: true
}, console.log('correct'))
}else if(!usernameRegex.test(username)){
this.setState({
isUsernameCorrect: false
}, console.log('not correct'))
}
console.log(this.state.isUsernameCorrect)
console.log(username)
}
它总是在输入下一个键之前记录用户名,例如,如果给定的用户名是DDD
传入的值将是DD,因为它在更改值之前提供了用户名
【问题讨论】:
-
您的正则表达式格式不符合您的目的 - 它只传递了两个字符:regex101.com
-
问题出在你的正则表达式上。您的正则表达式具有三个元素。你的第一个字符必须是一个字母或一个数字,你可以有一个或多个。您的下一个捕获范围更广,但您可以拥有其中的零个。最终捕获必须是一个或多个字母/数字。因此,任何由字母和/或数字组成的两位数密码都会通过此正则表达式。你想强制什么模式?
-
我在这里重新创建了您的帖子:codesandbox.io/s/llzlxoj7p7 尝试创建更严格的正则表达式,我怀疑它会解决您的问题
-
您的
onChange代码不正确。查看@lux 发布的沙箱,了解如何正确编写。 -
问题是,我将另一个函数作为回调传递给 setState,因此该函数不会接收到更新的状态。感谢 lux 的解决方案!
标签: reactjs