React-如何将对象推入嵌套在数组中的数组

时间:2019-05-06 19:47:06

标签: javascript reactjs

我目前正在学习React,所以如果我使用的术语不正确,我深表歉意。

我正在创建一个包含多列的项目,每列都有一个“添加”按钮。弹出该按钮可打开模式框,用户可以在其中输入文本字符串。然后,我希望返回此字符串,并将其显示在特定的列中。根据我要引用的列的索引,尝试确定如何更新setState时遇到了麻烦。

我从模态返回列ID,然后将该列ID与状态中设置的列ID进行比较。我想知道如何获取已获取的column [index]并将其用于使用addCard方法中的card对象更新cards数组。

class Board extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      modalOpen: false,
      columns: [
        {
          title: '',
          id: uuid(),
          cards: []
        },
        {
          title: '',
          id: uuid(),
          cards: []
        },
        {
          title: '',
          id: uuid(),
          cards: []
        }
      ],
      currentColumnID: null
    };
  }
  openModal = (colID) => {
    this.setState(state => {
      return {
        modalOpen: true,
        currentColumnID: colID
      };
    });
  };
  closeModal = () => {
    this.setState(state => {
      return {
        modalOpen: false
      };
    });
  };
  addCard = (cardValue) => {
    const card = {
      value: cardValue,
      id: uuid()
    };
    // compare column IDs to currentColumnID
    // return the index of whichever column is "true"
    const index = this.state.columns.map((column, i) => {     
      if(column.id === this.state.currentColumnID) {
        return i;
      }
    });

    // add card to returned column

    this.setState(state => {
      return {
        modalOpen: false
      };
    });
  };

2 个答案:

答案 0 :(得分:2)

在您的addCard方法中。找到该列,然后将卡推入阵列。

addCard = (cardValue) => {
  const card = {
      value: cardValue,
      id: uuid()
  };

  // Find the column
  const column = this.state.columns.find(column => {
      return column.id === this.state.currentColumnID;
  })

  // add card to returned column
  if (column != null) {
      column.cards.push(card);
  }

  this.setState(state => {
      return {
          modalOpen: false
      };
  });
};

答案 1 :(得分:0)

您可以在setState中直接对其进行管理。

addCard = cardValue => {
    const card = {
      value: cardValue,
      id: uuid()
    };
    this.setState(prevState => ({
      columns: prevState.columns.map(column => ({
        ...column,
        cards: column.id === prevState.currentColumnID ? [...column.cards, card] : column.cards
      })),
      modalOpen: false
    }))
  };