我正在尝试使用setState从数组中删除(半)深层嵌套的项目,但它似乎不起作用。我的状态结构如下:
state = {
currentSeries: null,
currentRowIndex: null,
rows: [
{
id: shortid.generate(),
nodes: [],
series: [], // array with item I want to remove
},
],
};
和我的删除项目调用:
onRemoveModelElementClick = (rowId, modelElementId) => {
this.setState((prevState) => {
const index = prevState.rows.findIndex(x => x.id === rowId);
const series = prevState.rows[index].series.filter(s => s.id !== modelElementId);
return series;
});
};
我尝试了几种方式传播剩余状态,但似乎无法正确更新。我rowId和modelElementId是正确的,并且我可以验证它们是否确实过滤出正确的项目。我在退货上遇到麻烦。我知道这很简单,但对于我的一生我看不到。
答案 0 :(得分:1)
我的建议是使用.map
使事情更容易消化。然后可以这样写:
onRemoveModelElementClick = (rowId, modelElementId) => {
const updatedRowsState = this.state.rows.map(row => {
// this is not the row you're looking for so return the original row
if (row.id !== rowId) {
return row;
}
const filteredSeries = row.series.filter(s => s.id !== modelElementId);
return {
// spread properties (id, node, series)
...row,
// overwrite series with item filtered out
series: filteredSeries,
};
});
// since rest of the state doesn't change, we only need to update rows property
this.setState('rows', updatedRowsState);
}
希望这对您有所帮助。
答案 1 :(得分:0)
我认为这里的问题是您的代码如何使用setState
。 setState
函数必须返回一个对象。假设您描述的过滤功能正确无误,请返回一个对象以更新状态:
return { series };
答案 2 :(得分:0)
如果可以帮助其他人,这就是我要做的事情:
onRemoveModelElementClick = (rowId, modelElementId) => {
this.setState((prevState) => {
const updatedRowState = prevState.rows.map((row) => {
if (row.id !== rowId) {
return row;
}
const filteredSeries = row.series.filter(s => s.id !== modelElementId);
return {
...row,
series: filteredSeries,
};
});
return {
rows: updatedRowState,
};
});
};
赞扬Dom的出色想法和逻辑!