[英]Update nested array using setState()
I want to setState() to edit parameter value which is in parameterData Array .我想 setState() 来编辑parameterData Array中的参数值。 using setState method.使用 setState 方法。 If we can do this without any third part library like Immutabilty helper or lodash that would be great!如果我们可以在没有任何第三方库(例如 Immutabilty helper或lodash)的情况下做到这一点,那就太好了!
const[state,setState]= useState ([{
"id": 0,
"targets": {
"ageGender": {
"key":value
},
"parameterData": [
{
"id": 1,
"parameter": "Low",
"expression": "<",
"val": "10",
"indicator": "Select"
},
]
}
}])
I have tried this solution where我已经尝试过这个解决方案
idx = state index where object is situated idx = state 索引 object 所在的位置
index = index of parameterData array to be changed index = 要更改的 parameterData 数组的索引
event = event of change事件 = 变化事件
const handleChangeTextParameter = (event, index, idx) => {
const { name, value } = event.target;
setState((prev) => {
const newState = prev.map((obj, index1) => {
let fil;
if (index1 === idx) {
fil = obj.targets.parameterData.map((data, indexOne) => {
if (indexOne === index) {
return { ...data, parameter: value };
}
return data;
});
const p = obj.targets.parameterData.map(
(obj) => fil.find((o) => o.id === obj.id) || obj
);
return { ...obj, targets: { ...obj.targets, parameterData: p } };
}
});
return newState;
});
};
Disclaimer: The state variables you defined are called state
and setState
, but in your handleChangeTextParameter
you are using setTargets
so I assume they are the same免责声明:您定义的 state 变量称为state
和setState
,但在您的handleChangeTextParameter
中您使用的是setTargets
所以我认为它们是相同的
I think the following should work:我认为以下应该有效:
setTargets((prev) => {
const newTargets = prev.map((object, objectIndex) => {
if (objectIndex !== idx) return object;
return {
...object,
targets: {
...object.targets,
parameterData: object.target.parameterData.map((data, dataIndex) => {
if (dataIndex !== index) return data;
return { ...data, parameter: value };
}),
},
};
});
return newTargets;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.