javascript - React - 使用 setState 更新状态中的对象数组

标签 javascript arrays reactjs object setstate

我正在开发一款餐 table 规划应用程序,可以将客人分配到餐 table 。 我在名为 tabledata 的状态下创建了一个对象数组,其中将包含如下对象:

    this.state = {
      tabledata: [
        {
          name: "Top Table",
          guests: ["guest1", "guest2", "guest3"]
        },
        {
          name: "Table One",
          guests: ["guest3", "guest4", "guest5"]
        }
      ]
    }

然后,我创建一个拖放界面,客人可以在其中在 table 之间移动。我尝试像这样更新状态:

  updateTableList (tablename, guest) {
    const selectedTableObj = this.state.tabledata.filter((tableObj) => tableObj.name === tablename);
    const otherTableObjs = this.state.tabledata.filter((tableObj) => tableObj.name !== tablename);

    selectedTableObj[0].guests.push(guest);
    const updatedObjectArray = [...otherTableObjs, selectedTableObj];

    this.setState({
      tabledata: [...otherTableObjs, ...selectedTableObj]
    });

  }

这可行,但因为我从状态中删除 selectedTableObj ,然后将其添加到数组的末尾,所以我在屏幕上得到了一些奇怪的结果。更新后的表格始终位于页面底部(如您所料)。

如何更新对象而不更改其在数组中的位置?

最佳答案

使用 Array.findIndex() 查找要更新的表的索引。创建一个新的 tabledata 数组。使用Array.slice()获取更新表之前和之后的项目,以及 spread将它们放入新的 tabledata 数组中。使用对象扩展创建一个新的表格对象,添加更新的 guests 数组,并在前面的项目之间添加表格对象:

代码(未测试):

updateTableList(tablename, guest) {
  this.setState((prevState) => {
    const tableData = prevState.tabledata;
    const selectedTableIndex = tableData.findIndex((tableObj) => tableObj.name === tablename);
    const updatedTable = tableData[selectedTableIndex];

    return {
      tabledata: [
        ...prevState.tabledata.slice(0, selectedTableIndex),
        {
          ...updatedTable,
          guests: [...updatedTable.guests, guest]
        },
        ...prevState.tabledata.slice(selectedTableIndex + 1)
      ]
    };
  });
}

关于javascript - React - 使用 setState 更新状态中的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50175588/

相关文章:

javascript - 扩展 React 组件和附加类

javascript - 在 Firebase 数据库 (Web) 中读取/写入嵌套数据

javascript - 单击 Enter 并单击提交按钮时提交表单数据

javascript - html5输入类型范围始终指向最小值并且在文本输入上没有得到onChange

javascript - 遍历每个数据为 : for loop vs . 的数组的 javascript 数组

javascript - 如何在 JavaScript 中创建数组的数组并将数据填充到其中?

javascript - 在 React 中使用 fullcalendar v4 导入 rrule 插件

javascript - jQuery 使用动态创建的按钮切换动态创建的表中的下一行

arrays - 将 JSON 数组输出打印到 Google Sheet

javascript - React 中的 HTML5 音频标签