我正在创建此函数以在输入无效输入时更改输入的样式。除了电子邮件验证之外,一切正常。 (我希望边框在一切正常时变为绿色,而在不是时变为红色。我的所有控制台日志都按照我的要求完全出现,所以我相信正则表达式是正确的...它只是没有像它应该的那样改变边界。
知道为什么吗?
onInputBlur = (event) => {
console.log('onblur')
let inputInfo = event.target
let inputVal = event.target.value,
{ styles } = this.props,
fontSize = styles.placeholder.fontSize || 10,
top = styles.placeholder.top || 4
let emailRegex = new RegExp(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i);
console.log(inputInfo.id.toString())
console.log(emailRegex.test(inputVal))
if(inputVal){
//zipcode
if(inputInfo.id.toString() == 'zip' && inputVal.split('').length < 4){
console.log('ziphit')
return this.setState(state =>({
inputCSS:{
...state.inputCSS,
border: '1px solid red'
}
}))
} else if (inputInfo.id.toString() == 'zip' && inputVal.split('').length >= 4){
return this.setState(state => ({
inputCSS: {
...state.inputCSS,
border: '1px solid green'
}
}))
}
//phone
if(inputInfo.id.toString() == 'phone' && inputVal.split('').length < 10){
return this.setState(state =>({
inputCSS: {
...state.inputCSS,
border: '1px solid red'
}
}))
} else {
return this.setState(state => ({
inputCSS: {
...state.inputCSS,
border: '1px solid green'
}
}))
}
//email
if(inputInfo.id.toString() == 'email' && !emailRegex.test(inputVal)){
console.log('email hit - invalid input')
return this.setState(state => ({
inputCSS: {
...state.inputCSS,
border: '1px solid red'
}
}))
} else {
console.log('email hit - valid email')
return this.setState(state => ({
inputCSS: {
...state.inputCSS,
border: '1px solid green'
}
}))
}
return this.setState(state =>({
inputCSS: {
...state.inputCSS,
border: '1px solid green'
}
}))
} else {
return this.setState(state=> ({
inputCSS: {
...state.inputCSS,
border: '1px solid red'
}
}))
}
}
答案 0 :(得分:1)
您正在使用if / else @ phone进行检查。尝试在手机套else
(在电子邮件之前运行)中使用console.logging,我假设它会触发您现在放置的console.log();
。
您知道,如果您输入的字段不是if(inputInfo.id.toString() == 'phone' && inputVal.split('').length < 10)
,则else
语句将始终返回phone
。
所以,你永远不会通过电话else
声明。电子邮件位于其下方,但该功能在它到达之前就会返回。电子邮件检查永远不会被执行。
它应该像你的第一个功能,就像这样;
if(inputInfo.id.toString() == 'phone' && inputVal.split('').length < 10){
return this.setState(state =>({
inputCSS: {
...state.inputCSS,
border: '1px solid red'
}
}))
} else if(inputInfo.id.toString() == 'phone') {
return this.setState(state => ({
inputCSS: {
...state.inputCSS,
border: '1px solid green'
}
}))
}
- 确保对所有这些情况都这样做。
顺便说一下,通常情况下,在这些类型的场景中使用switch-cases。 开关盒不需要else-if。它实际上打破了它应该打开的情况,防止像你现在面临的问题。 像这样;
var fieldType = inputInfo.id.toString();
switch (fieldType) {
case "phone":
if (inputVal.split('').length) {
//return on true
} else {
//return on false;
}
break;
}
更好的做法是在代码中没有这么多回报,就像这样;
var fieldType = inputInfo.id.toString();
var returnValue = {};
switch (fieldType) {
case "phone":
if (inputVal.split('').length) {
returnValue.state = "my stuff";
} else {
returnValue.state = "my stuff";
}
break;
case "email":
if (inputVal.split('').length) {
returnValue.state = "my stuff";
} else {
returnValue.state = "my stuff";
}
break;
}
return this.setState(returnValue);
抱歉不使用ES6。我还不知道任何ES6语法=)