React - 使用 setState 函数调用删除嵌套数组项
React - remove nested array item using setState function call
我正在尝试使用 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 是正确的,我可以验证它们确实过滤掉了正确的项目。我只是不知道该做什么 return。我知道这很简单,但对于我来说,我看不到它。
我的建议是使用 .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);
}
希望这对您有所帮助,如果您有任何问题,请告诉我。
我认为这里的问题是您的代码如何使用 setState
。 setState
函数必须 return 一个对象。假设您的过滤功能如您所描述的那样正确,return 一个更新状态的对象:
return { series };
以下是我为使其正常工作所做的工作,以防它可以帮助其他人:
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!
我正在尝试使用 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 是正确的,我可以验证它们确实过滤掉了正确的项目。我只是不知道该做什么 return。我知道这很简单,但对于我来说,我看不到它。
我的建议是使用 .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);
}
希望这对您有所帮助,如果您有任何问题,请告诉我。
我认为这里的问题是您的代码如何使用 setState
。 setState
函数必须 return 一个对象。假设您的过滤功能如您所描述的那样正确,return 一个更新状态的对象:
return { series };
以下是我为使其正常工作所做的工作,以防它可以帮助其他人:
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!