javascript - 更改状态而不覆盖 react 中的其他值

标签 javascript reactjs

我正在尝试更改应用程序的状态,而不覆盖未更改的值。我正在使用扩展运算符来执行此操作,但出现了问题。

这是我的基本状态: useState({data : [{name : undefined , project : []}] });

使用setState,我只想添加名称,但将项目数组保留为空,因为它没有更改。

setManager(prevState => ({...prevState , data : res.data}))

执行 setState 后,新状态如下所示:

[
    {name: "John doe"},
    {name: "Jane Doe"}
]

如您所见,默认状态已被完全覆盖。

顺便说一句,res.data 看起来像这样:

[
  {name: "john doe"},
  {name: "jane doe"}
] 

最佳答案

通过 setManager(prevState => ({...prevState , data : res.data})) 您只需覆盖早期的“main”data 属性.

data 是一个数组,新值在数组中...只需 concat 它们

setManager(prevState => ({...prevState , 
  data : prevState.data.concat( res.data )
}))

之后你应该有

[  
  {name: undefined , project : []},  
  {name: "john doe"},
  {name: "jane doe"}
] 

...但您可能想单独管理名称和项目:

const [manager, setManager] = useState({
  data: { 
    name: undefined, 
    project: []
  }
});

...甚至

const [manager, setManager] = useState({
  name: undefined, 
  project: []
});

这样您就不需要使用“中介”.data来“处理”此数据

<Component names={manager.name} />

...不是{manager.data.name}

当然,仅更新名称需要不同的代码

setManager(prevState => ({
  ...prevState, 
  name : prevState.name.concat( res.data )
}))
  • ...prevState 防止删除 project 属性
  • name 应使用 [] 初始化,而不是 undefined
  • 条件渲染可以通过 `{!manager.name.lenght && ... }

如果您有单独的状态“切片”,则无需使用一个公共(public)状态,请使用多个 useState 声明。

关于javascript - 更改状态而不覆盖 react 中的其他值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60930779/

相关文章:

javascript - 在 React 中使用 2D map 打印棋盘

javascript - 在调用javascript函数时传递变量?

javascript - jQuery UI 可选择小部件通过鼠标拖动多次取消选择

javascript - 关闭模式后刷新使用自定义 Hook 获取的数据

reactjs - 找不到模块 'webpack/lib/rules/BasicEffectRulePlugin'

javascript - 如何在 React-native 中覆盖其他应用程序?

javascript - 调整由 ng-if 指令动态生成的 <div> 标签的高度

javascript - 有序 JavaScript 文件加载

javascript - 同步 promise 解析(bluebird vs. jQuery)

ruby-on-rails - 使用 React 将 RoR 应用程序部署到 heroku 时不显示 Bootstrap 样式