javascript - setState 具有数组属性的嵌套对象的属性的正确方法

标签 javascript reactjs babeljs jsx

美好的一天!我有一个带有数组子项的嵌套状态,我想知道 setState 的正确和最佳方法。

这是一个示例状态对象。 已编辑,忘记提及列表是一个对象数组

this.state = {
     lists:
          [{

               name: 'sampleList',
               id: 15,
               permission: {
                    canRead: true,
                    canWrite: false
               }
          }]
     }
}

我使用它来设置权限属性的状态,但状态未更新。

this.setState({
     ...this.state, lists: {
          ...this.state.lists, key: [
               ...this.state.lists.key, permission : {
                    ...this.state.lists.key.permission, 
                    canRead: !this.state.lists.key.permission.canRead
               }
          ] 
     }
 });

希望你能帮助我。谢谢!

最佳答案

您可以创建 lists 数组的副本,然后将要更改的索引的对象替换为同一对象的副本,但您在其中更改了权限.

示例

class App extends React.Component {
  state = {
    lists: [
      {
        name: "sampleList",
        id: 15,
        permission: {
          canRead: true,
          canWrite: false
        }
      }
    ]
  };

  updateList = (index, canRead, canWrite) => {
    this.setState(prevState => {
      const lists = [...prevState.lists];
      lists[index] = { ...lists[index], permission: { canRead, canWrite } };
      return { lists };
    });
  };

  render() {
    return (
      <div>
        <button onClick={() => this.updateList(0, false, true)}>
          Update state
        </button>
        <div>{JSON.stringify(this.state)}</div>
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>

关于javascript - setState 具有数组属性的嵌套对象的属性的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53325985/

相关文章:

javascript - Nodejs v5 如何让我们使用 ES6 模块?

javascript - 如何识别一个字符串是否是一个对象?

node.js - package.json 脚本在 heroku 上失败

javascript - 设置 React-Router 时遇到问题

javascript - React Jest 测试失败 - type.toUpperCase 不是函数

javascript - 使用 babel 避免 "default"属性间接

javascript - Javascript 中的原型(prototype)继承

javascript - jQuery 获取 YouTube 视频标题

javascript - 如何在鼠标悬停时将焦点设置到输入元素(搜索框)?

babeljs - babel-preset-env 和 @babel/preset-env 有什么区别