React Hooks:地图函数中的 setState 钩子
React Hooks: setState hook inside map function
我目前正在努力解决 setState 与表单的异步性质,我的预期行为是当用户单击 submitForm 按钮时,它会检查状态内的所有表单值,如果该值为空,则它会设置 errorState对于特定的表单元素,以便出现错误消息
const [values, setValues] = React.useState({
firstName: '',
lastName: '',
id: '',
city: '',
emailAddress:'',
mobileNumber: ''
});
const [errors, setError] = React.useState({
firstName: false,
lastName: false,
id: false,
city: false,
emailAddress: false,
mobileNumber: false
})
const submitForm = () => {
const setErrorArray = Object.keys(values).map((key) => {
if (values[key] === '') {
setError({...errors, [key]: true })
}
});
}
我认为问题是由于 setState 是异步的,所以在 .map 完成后它只将错误对象中的最后一个值设置为 true(因此 errors.mobileNumber = true)。而不是使所有符合条件的值都为真。传播运算符 {...errors} 将值覆盖为初始 false value.Is 无论如何,如果 values 数组中的值为空,则 errors 中的每个键都设置为 true ??
如有任何帮助,我们将不胜感激
我将通过映射值的条目立即构建全新的错误对象,然后您可以使用该对象调用 setError
:
const values = {
firstName: 'first',
lastName: 'last',
id: '',
city: '',
};
const newErrors = Object.fromEntries(
Object.entries(values).map(
([key, val]) => [key, val === '']
)
);
console.log(newErrors);
// setError(newErrors);
我目前正在努力解决 setState 与表单的异步性质,我的预期行为是当用户单击 submitForm 按钮时,它会检查状态内的所有表单值,如果该值为空,则它会设置 errorState对于特定的表单元素,以便出现错误消息
const [values, setValues] = React.useState({
firstName: '',
lastName: '',
id: '',
city: '',
emailAddress:'',
mobileNumber: ''
});
const [errors, setError] = React.useState({
firstName: false,
lastName: false,
id: false,
city: false,
emailAddress: false,
mobileNumber: false
})
const submitForm = () => {
const setErrorArray = Object.keys(values).map((key) => {
if (values[key] === '') {
setError({...errors, [key]: true })
}
});
}
我认为问题是由于 setState 是异步的,所以在 .map 完成后它只将错误对象中的最后一个值设置为 true(因此 errors.mobileNumber = true)。而不是使所有符合条件的值都为真。传播运算符 {...errors} 将值覆盖为初始 false value.Is 无论如何,如果 values 数组中的值为空,则 errors 中的每个键都设置为 true ??
如有任何帮助,我们将不胜感激
我将通过映射值的条目立即构建全新的错误对象,然后您可以使用该对象调用 setError
:
const values = {
firstName: 'first',
lastName: 'last',
id: '',
city: '',
};
const newErrors = Object.fromEntries(
Object.entries(values).map(
([key, val]) => [key, val === '']
)
);
console.log(newErrors);
// setError(newErrors);