Redux Reducer:通过键不可变地更新数组中的对象
Redux Reducer: Update object in array by key immutably
问题:用 key = 1 更新 devData 数组中的对象:-> 更新 data 和 日期时间
//Redux state:
{
info: {
success: true,
devData: [
{
key: 1,
data: { <- update this
power: 48 ,
unit: "kWh"
},
dateTime: "2019-08-24T18:21:21.000Z" <- update this
},
{
key: 2,
data: {
power: 48,
unit: "kWh"
},
dateTime: "2019-08-24T18:21:01.000Z"
}
]
}
}
我在reducer中的更新方法:
switch (action.type) {
case 'update':
return {
...state,
info: {
...state.info,
devData: state.info.devData.map(currentValue => {
if (currentValue.key === 1) {
currentValue.data = action.payload.data;
currentValue.dateTime = action.payload.dateTime;
}
return currentValue;
})
}
};
}
我的问题:
我的更新方法复杂丑陋,难以理解
我不确定,我是否真的以 不可变 方式进行此更新
我认为我的更新方法计算量大,效率不高
我需要一种更新方法来解决上述问题。
首先安装immer
.
然后只更新您想要的 state
的一部分。
import produce from "immer"
(...)
switch (action.type) {
case 'update':
return produce(state, draft => {
draft.info.devData[0].data = action.payload.data;
draft.info.devData[0].dateTime = action.payload.dateTime;
//This code is working ONLY with devData[0]
//So, You SHOULD change this above code to work as dynamically.
});
}
immer
是更新 state
具有不变性的超级简单方法。
强烈推荐使用
case “update”:
const index = this.state.devData.findIndex(v => v.key === 1);
return {
...state,
info: {
...state.info,
devData:
[
return [
...state.info.devData.slice(0, index),
{
data: action.payload.data,
dateTime: action.payload.dateTime
},
...state.slice(index + 1)
]
]
}
};
想法是首先找到需要更新的元素的索引。之后,使用传播运算符创建新区域,由以下内容组成:slice
要更新的元素之前的所有内容 + 更新的元素 + 更新元素之后的所有内容。
ps。用我的手机写所以没有测试它
问题:用 key = 1 更新 devData 数组中的对象:-> 更新 data 和 日期时间
//Redux state:
{
info: {
success: true,
devData: [
{
key: 1,
data: { <- update this
power: 48 ,
unit: "kWh"
},
dateTime: "2019-08-24T18:21:21.000Z" <- update this
},
{
key: 2,
data: {
power: 48,
unit: "kWh"
},
dateTime: "2019-08-24T18:21:01.000Z"
}
]
}
}
我在reducer中的更新方法:
switch (action.type) {
case 'update':
return {
...state,
info: {
...state.info,
devData: state.info.devData.map(currentValue => {
if (currentValue.key === 1) {
currentValue.data = action.payload.data;
currentValue.dateTime = action.payload.dateTime;
}
return currentValue;
})
}
};
}
我的问题:
我的更新方法复杂丑陋,难以理解
我不确定,我是否真的以 不可变 方式进行此更新
我认为我的更新方法计算量大,效率不高
我需要一种更新方法来解决上述问题。
首先安装immer
.
然后只更新您想要的 state
的一部分。
import produce from "immer"
(...)
switch (action.type) {
case 'update':
return produce(state, draft => {
draft.info.devData[0].data = action.payload.data;
draft.info.devData[0].dateTime = action.payload.dateTime;
//This code is working ONLY with devData[0]
//So, You SHOULD change this above code to work as dynamically.
});
}
immer
是更新 state
具有不变性的超级简单方法。
强烈推荐使用
case “update”:
const index = this.state.devData.findIndex(v => v.key === 1);
return {
...state,
info: {
...state.info,
devData:
[
return [
...state.info.devData.slice(0, index),
{
data: action.payload.data,
dateTime: action.payload.dateTime
},
...state.slice(index + 1)
]
]
}
};
想法是首先找到需要更新的元素的索引。之后,使用传播运算符创建新区域,由以下内容组成:slice
要更新的元素之前的所有内容 + 更新的元素 + 更新元素之后的所有内容。
ps。用我的手机写所以没有测试它