reactjs - 有没有办法通过查找 Item 来更新状态并替换嵌套状态?
问题描述
我正在组件状态下构建我的模块的订单功能,因此状态对象看起来像这样
"activity": {
"name": "rewwerwer",
"description": "werwerwerwerwer",
"modules": [
{
"name": "Text",
"order": 1,
"module_id": 1612,
},
{
"name": "Text2",
"order" 2,
"module_id": 1592,
}
]
}
handleSortUp = (moduleid ,newOrder) => {
const { modules } = this.state.activity;
const module = modules.find(element => element.module_id === moduleid);//Thios returns the correct object
this.setState({ activity: { ...this.state.activity.modules.find(element => element.module_id === moduleid), order: newOrder } });
}
我试过了,但它更新了订单字段和对象,但也从模块数组中删除了所有其他对象:<
我只想用模块ID替换每个模块上的订单字段并将其余数据留在那里
handleSortUp(1612,14) 时我需要的状态的所需响应;被解雇
handleSortUp(1612,2);
{
"name": "rewwerwer",
"description": "werwerwerwerwer",
"modules": [
{
"name": "Text",
"order": 2,
"module_id": 1612,
},
{
"name": "Text2",
"order": 1,
"module_id": 1592,
}
]
}
我可以在一个简单的数组上做到这一点,问题是如何在反应时更新状态
另外一种更改订单的方法也得到了很好的回答,但是如何更改已注册该订单的字段所以当我们触发更改项目 1 订单时2 项目 2 需要接受订单 1
谢谢
解决方案
当然!这将是使用可用于数组的内置 .map 方法的好地方。考虑以下示例。
let array = [{order: 1, type: "food"}, {order: 2, type: "notfood"} ]
const newArray = array.map((item) => {
//CHECK TO SEE IF THIS IS THE ITEM WE WANT TO UPDATE
if(item.order == 1){
return {
...item,
newField: "newData"
}
} else {
return item
}
})
输出是:
[{order: 1, type: "food", newField: "newData"}
{order: 2, type: "notfood"}]
所以是的,您可以完全更新您正在寻找的模块,而无需改变阵列的其余部分。然后使用您的发现使用一些好的 ol spread 来更新组件状态。
this.setState({
activity: {
...this.state.activity,
modules: newArray}
})
推荐阅读
- flutter - 颤振:下拉问题
- firebase - firebase oauth2 accessToken 没用
- mysql - node-hapi 代码部署在 aws 实例(micro t2)上 - 一段时间后,swagger 响应为空
- ruby-on-rails-3 - 如何使用 .verify 验证 jwt 令牌而不是 rails 中的 .decode 方法?
- django - MariaDB 在 Django 中替换 MySQL
- sql - 我正在尝试使此功能和触发器工作:
- python - 在 unittest 中测试条件导入
- r - For循环交叉验证R
- javascript - 如何将单独的 JS 文件中的值传递给 Thymeleaf
- git - 让任何人都可以编辑 GitHub 存储库