React 无法在 onClick 函数中设置变量
React cannot set variable inside onClick function
我正在尝试在 onClick 事件中设置一个变量。我正在将错误消息设置到变量中。
const handleEdit = (e) => {
e.preventDefault();
if (edit_user.email == "") {
setEditUserError({ email: "Please enter an email!" })
}
if (edit_user.company == "") {
setEditUserError({ ...edit_user_error, company: "Please enter company!" })
}
我正在以 <span className="text-danger">{edit_user_error.company}</span>
的形式显示错误
问题是当所有字段都为空并且当我单击按钮时只显示最后一条消息。当我将一个字段设为空,然后单击提交按钮时,它工作正常。我试过 console.log(edit_user_error)
但它显示为空。我究竟做错了什么?请帮忙
这是因为批量状态更新。 React 将尝试通过最小化状态更新来减少渲染。您可以使用功能状态更新来解决此问题:
if (edit_user.email == "") {
setEditUserError({ email: "Please enter an email!" });
}
if (edit_user.company == "") {
// this callback gets executed only when previous state updates are done
setEditUserError((prev) => ({ ...prev, company: "Please enter company!" }));
}
要在字段有效时清除错误:
const getErrors = () => {
return {
...(!edit_user.email ? { email: "Please enter an email!" } : {}),
...(!edit_user.company ? { company: "Please enter company!" } : {}),
};
};
const handleEdit = (e) => {
e.preventDefault();
setEditUserError(getErrors());
};
React 状态更新是异步的,这意味着它们不会立即 运行。因此,当 运行 将多个 setState
设置为相同状态时,您不能期望第一个 setState
调用的状态在第二个 setState
调用发生之前更新。
简而言之,React 会忽略您之前的 setState
调用,因为它们一个接一个地发生。
解决方案是将更新放入单个调用中:
const handleEdit = (e) => {
e.preventDefault();
let errors = {};
if (edit_user.email == "") {
errors.email = "Please enter an email!"
}
if (edit_user.company == "") {
errors.company = "Please enter company!"
}
// and then we call state with all the values, only once
setEditUserError(errors);
我正在尝试在 onClick 事件中设置一个变量。我正在将错误消息设置到变量中。
const handleEdit = (e) => {
e.preventDefault();
if (edit_user.email == "") {
setEditUserError({ email: "Please enter an email!" })
}
if (edit_user.company == "") {
setEditUserError({ ...edit_user_error, company: "Please enter company!" })
}
我正在以 <span className="text-danger">{edit_user_error.company}</span>
问题是当所有字段都为空并且当我单击按钮时只显示最后一条消息。当我将一个字段设为空,然后单击提交按钮时,它工作正常。我试过 console.log(edit_user_error)
但它显示为空。我究竟做错了什么?请帮忙
这是因为批量状态更新。 React 将尝试通过最小化状态更新来减少渲染。您可以使用功能状态更新来解决此问题:
if (edit_user.email == "") {
setEditUserError({ email: "Please enter an email!" });
}
if (edit_user.company == "") {
// this callback gets executed only when previous state updates are done
setEditUserError((prev) => ({ ...prev, company: "Please enter company!" }));
}
要在字段有效时清除错误:
const getErrors = () => {
return {
...(!edit_user.email ? { email: "Please enter an email!" } : {}),
...(!edit_user.company ? { company: "Please enter company!" } : {}),
};
};
const handleEdit = (e) => {
e.preventDefault();
setEditUserError(getErrors());
};
React 状态更新是异步的,这意味着它们不会立即 运行。因此,当 运行 将多个 setState
设置为相同状态时,您不能期望第一个 setState
调用的状态在第二个 setState
调用发生之前更新。
简而言之,React 会忽略您之前的 setState
调用,因为它们一个接一个地发生。
解决方案是将更新放入单个调用中:
const handleEdit = (e) => {
e.preventDefault();
let errors = {};
if (edit_user.email == "") {
errors.email = "Please enter an email!"
}
if (edit_user.company == "") {
errors.company = "Please enter company!"
}
// and then we call state with all the values, only once
setEditUserError(errors);