提交按钮需要点击 2 次才能在 React 中调用函数
Submit button takes 2 clicks to call function in React
当我点击提交按钮时,它需要点击才能正确触发该功能。在实施 if 语句之前我没有遇到问题。我有 2 个 if 语句,每次点击后它只检查 1 个 if 语句吗?
onSubmit = (e) => {
const { firstName, lastName, email, eventDate, validation} = this.state
if (firstName, lastName, eventDate, email) {
this.setState({validation: true})
if (new RegExp(/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,15}/g).test(email)) {
this.setState({validation: true})
} else {
this.setState({validation: false})
this.setState({errorMessage: 'Please enter correct email adress'})
}
} else {
this.setState({validation: false});
this.setState({errorMessage: 'Please fill in all fields properly'})
}
if (validation) {
const newEvent = {
firstName: this.state.firstName,
lastName: this.state.lastName,
email: this.state.email,
eventDate: this.state.eventDate
}
this.props.addEvent(newEvent);
this.setState({
firstName: '',
lastName: '',
email: '',
eventDate: '',
validation: false,
errorMessage: ''
});
}
e.preventDefault();
}
您也不应该需要在彼此之后直接调用两个 setState。像这样将它们放在一个 setState 中:
this.setState({
验证:假,
错误消息:'Please enter correct email adress',
)}
我认为您在 if(validation) 语句中使用了过时的验证值。你能试试这样的东西吗:
onSubmit = (e) => {
const { firstName, lastName, email, eventDate} = this.state
if (firstName, lastName, eventDate, email) {
this.setState({validation: true})
if (new RegExp(/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,15}/g).test(email)) {
this.setState({validation: true})
} else {
this.setState({validation: false})
this.setState({errorMessage: 'Please enter correct email adress'})
}
} else {
this.setState({validation: false});
this.setState({errorMessage: 'Please fill in all fields properly'})
}
const {validation} = this.state // read correct validation.. not something that was previously set
if (validation) {
const newEvent = {
firstName: this.state.firstName,
lastName: this.state.lastName,
email: this.state.email,
eventDate: this.state.eventDate
}
this.props.addEvent(newEvent);
this.setState({
firstName: '',
lastName: '',
email: '',
eventDate: '',
validation: false,
errorMessage: ''
});
}
e.preventDefault();
}
解决了这个问题,他们成功的关键是将我的 if(validation) 语句主体移动到 setState 的回调函数。
这是工作代码:
onSubmit = (e) => {
const { firstName, lastName, email, eventDate, validation} = this.state
if (firstName, lastName, eventDate, email) {
this.setState({validation: true})
if (new RegExp(/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,15}/g).test(email)) {
this.setState({validation: true}, () => {
const newEvent = {
firstName: firstName,
lastName: lastName,
email: email,
eventDate: eventDate
}
this.props.addEvent(newEvent);
this.setState({
firstName: '',
lastName: '',
email: '',
eventDate: '',
validation: false,
errorMessage: ''
})
})
} else {
this.setState({validation: false, errorMessage: 'Please enter correct email adress'})
}
} else {
this.setState({validation: false, errorMessage: 'Please fill in all fields properly'})
}
e.preventDefault();
}
当我点击提交按钮时,它需要点击才能正确触发该功能。在实施 if 语句之前我没有遇到问题。我有 2 个 if 语句,每次点击后它只检查 1 个 if 语句吗?
onSubmit = (e) => {
const { firstName, lastName, email, eventDate, validation} = this.state
if (firstName, lastName, eventDate, email) {
this.setState({validation: true})
if (new RegExp(/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,15}/g).test(email)) {
this.setState({validation: true})
} else {
this.setState({validation: false})
this.setState({errorMessage: 'Please enter correct email adress'})
}
} else {
this.setState({validation: false});
this.setState({errorMessage: 'Please fill in all fields properly'})
}
if (validation) {
const newEvent = {
firstName: this.state.firstName,
lastName: this.state.lastName,
email: this.state.email,
eventDate: this.state.eventDate
}
this.props.addEvent(newEvent);
this.setState({
firstName: '',
lastName: '',
email: '',
eventDate: '',
validation: false,
errorMessage: ''
});
}
e.preventDefault();
}
您也不应该需要在彼此之后直接调用两个 setState。像这样将它们放在一个 setState 中:
this.setState({ 验证:假, 错误消息:'Please enter correct email adress', )}
我认为您在 if(validation) 语句中使用了过时的验证值。你能试试这样的东西吗:
onSubmit = (e) => {
const { firstName, lastName, email, eventDate} = this.state
if (firstName, lastName, eventDate, email) {
this.setState({validation: true})
if (new RegExp(/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,15}/g).test(email)) {
this.setState({validation: true})
} else {
this.setState({validation: false})
this.setState({errorMessage: 'Please enter correct email adress'})
}
} else {
this.setState({validation: false});
this.setState({errorMessage: 'Please fill in all fields properly'})
}
const {validation} = this.state // read correct validation.. not something that was previously set
if (validation) {
const newEvent = {
firstName: this.state.firstName,
lastName: this.state.lastName,
email: this.state.email,
eventDate: this.state.eventDate
}
this.props.addEvent(newEvent);
this.setState({
firstName: '',
lastName: '',
email: '',
eventDate: '',
validation: false,
errorMessage: ''
});
}
e.preventDefault();
}
解决了这个问题,他们成功的关键是将我的 if(validation) 语句主体移动到 setState 的回调函数。
这是工作代码:
onSubmit = (e) => {
const { firstName, lastName, email, eventDate, validation} = this.state
if (firstName, lastName, eventDate, email) {
this.setState({validation: true})
if (new RegExp(/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,15}/g).test(email)) {
this.setState({validation: true}, () => {
const newEvent = {
firstName: firstName,
lastName: lastName,
email: email,
eventDate: eventDate
}
this.props.addEvent(newEvent);
this.setState({
firstName: '',
lastName: '',
email: '',
eventDate: '',
validation: false,
errorMessage: ''
})
})
} else {
this.setState({validation: false, errorMessage: 'Please enter correct email adress'})
}
} else {
this.setState({validation: false, errorMessage: 'Please fill in all fields properly'})
}
e.preventDefault();
}