reactjs - setState 到嵌套对象删除值
问题描述
我有以下状态:
const [state, setState] = React.useState({
title: "",
exchangeTypes: [],
errors: {
title: "",
exchangeTypes: "",
}
})
state.errors
如果不遵守条件,我正在使用表单验证来填充对象。
function formValidation(e){
const { name, value } = e.target;
let errors = state.errors;
switch (true) {
case (name==='title' && value.length < 4):
setState(prevState => ({
errors: { // object that we want to update
...prevState.errors, // keep all other key-value pairs
[name]: 'Title cannot be empty' // update the value of specific key
}
}))
break;
default:
break;
}
}
当我这样做时,对象会更新但它会删除我尚未更新的值。
在我调用 formValidation
我之前console.log(state)
是:
{
"title": "",
"exchangeTypes: [],
"errors": {
title: "",
exchangeTypes: "",
}
}
在我调用 formValidation 之后,
我console.log(state)
是:
{
"errors": {
title: "Title cannot be empty",
exchangeTypes: ""
}
}
所以我的其他state
价值观已经消失了。只有errors
对象。
我遵循了本指南:如何更新 React 中的嵌套状态属性
我想要的是:
{
"title": "",
"exchangeTypes: [],
"errors": {
title: "Title cannot be empty",
exchangeTypes: "",
}
}
我得到什么:
{
"errors": {
title: "Title cannot be empty",
exchangeTypes: "",
}
}
解决方案
与类组件中的 setState 不同,当您使用对象作为值时,通过 useState 的 setState 不会自动合并。你必须手动完成
setState((prevState) => ({
...prevState, // <- here
errors: {
// object that we want to update
...prevState.errors, // keep all other key-value pairs
[name]: 'Title cannot be empty', // update the value of specific key
},
}));
推荐阅读
- perforce - 如何 p4 搁置多个文件
- tfs - TFS REST API - 搜索
- ruby-on-rails - 如何为rails中的列设置一些默认值?
- javascript - 键盘避免视图 - React-Native?
- javascript - 反应内存泄漏
- jquery - jquery each 总是对它进行排序,希望它未排序
- unity3d - 如何修复变换不存在 Unity
- sql - 如何从 SQL 的列中删除垃圾字符 {{3*3}} ${3*3} <%= 3*3 %>?
- javascript - 将 fetch 调用的响应(对象)存储到对象数组中
- java - 使用弹簧数据混淆休眠行为