React - 使用 setState 函数调用删除嵌套数组项

IT技术 reactjs filter setstate
2021-05-22 04:03:37

我正在尝试使用 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 是正确的,我可以验证它们确实过滤掉了正确的项目。我只是在返回什么方面遇到了麻烦。我知道这很简单,但对于我的生活,我看不到它。

3个回答

我的建议是用来.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 { 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 的伟大想法和逻辑!