设置嵌套数组的状态

IT技术 javascript arrays reactjs
2021-05-11 21:24:03

我有这门课:

class Board {
    this.state = {
        lists : [{
            id: 0, 
            title: 'To Do',
            cards : [{id : 0}]
        }]
    }

并且想在“lists”状态数组内的“cards”数组上使用setState。以前,我在子组件中有卡数组,但现在我已将其移至 Board 类。这是我之前的功能。

deleteCards(id){
    this.setState({
        cards: this.state.cards.filter(card => card.id !== id)
    });
}

我如何更改它以便它现在可以工作,因为卡片在另一个阵列中?

我无法通过查看这些帖子来解决它:

ReactJS - 数组中对象键的 setState

如何编辑状态数组中的项目?

2个回答

要在内部完成所有操作setState(请注意, 的第一个参数setState是更新程序函数,第一个参数是对前一个状态的引用):

如果您可以提供listId来自来电者的信息:

deleteCards(listId, cardId) {
  this.setState(prevState => ({
    lists: prevState.lists.map((list) => {
      if (list.id !== listId) {
        return list
      }

      return {
        ...list,
        cards: list.cards.filter(card => card.id !== cardId) 
      }
    })
  }))
}

如果您无法listId从来电者处提供

deleteCards(id) {
  this.setState(prevState => ({
    lists: prevState.lists.map((list) => {
      if (list.cards.some(card => card.id === id)) {
        return {
          ...list,
          cards: list.cards.filter(card => card.id !== id) 
        }
      }

      return list
    })
  }))
}

您应该尝试使用新的休息和传播语法...

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

const newListItem = {this.state.lists[0].cards.filter....} 

this.setState({lists: [...this.state.lists.cards, newListItem]})

我会把它作为评论,但它会很难阅读。这只是您实际编写过滤器所需的一个示例。