如何为嵌套对象设置状态?

IT技术 javascript reactjs react-native
2021-03-16 02:17:53

对于我正在使用的插件,我必须有一个如下所示的状态:

getInitialState() {
  return {
    invalid: true,
    access: {
      access_code: '',
      zipcode: '',
      password: '',
      confirm: '',
      hospital_id: '',
    },
  }
},

如何在不设置其余访问权限的情况下设置 Hospital_id 的状态?

这似乎删除了除hospital_id之外的所有内容:

this.setState({access: {hospital_id: 1}})
6个回答

您有几个选择:

  1. 使用 ECMA6,您可以使用对象传播提议 ( ...) 创建具有更新属性的对象副本。

    this.setState({
      access: {
        ...this.state.access,
        hospital_id: 1,
      },
    });
    
  2. 您可以在 Object ( Object.assign())上使用本机分配函数

    this.setState({
      access: Object.assign({}, this.state.access, {
        hospital_id: 1,
      }),
    });
    
  3. 或者对于最短版本和原子更新:

     this.setState(({access}) => ({access: {
       ...access,
       hospital_id: 1,
     }});
    
  4. 还有一个选项是更新插件:

    var update = require('react-addons-update');
    // per React docs 
    // https://reactjs.org/docs/update.html 
    // , you may want to change this to 
    // import update from 'immutability-helper';
    this.setState({
      access: update(this.state.access, {
        hospital_id: {$set: 1},
      })
    });
    

我建议使用第一个。

显然这种方法在 Safari 上不起作用。它的行为不同。
2021-04-18 02:17:53
@Brigand 你能否详细说明一下(对于初学者来说)。刚刚回到JS并做出反应,这仍然有点令人困惑(特别是第一个代码块中函数之间的差异)。谢谢 :)
2021-05-05 02:17:53
考虑到 React 使用最新的 ES + Babel(大部分),这应该是公认的答案。对象扩展运算符是最简洁且易于 grep 的。
2021-05-17 02:17:53

let newAccess = Object.assign({}, this.state.access);
newAccess.hospital_id = 1;
this.setState({access: newAccess});

使用 setState 是间接修改状态的建议方法。现在你的意思可能是 let newAccess = Object.assign({}, this.state.access); 应该使用我以前没有想到的。在这种情况下,我可能会同意,因为这是我在其他地方使用的模式。
2021-04-20 02:17:53
你不应该直接改变状态
2021-05-09 02:17:53
2021-05-17 02:17:53

我现在首选的方法很简单:

let newAccess = this.state.access;
newAccess.hospital_id = 1;
setState({access: newAccess});

比当前接受的答案稍微简单。

编辑(基于来自@SILENT 的问题)

看起来这实际上是一种具有潜在危险的方法。在此处进一步阅读React:关于不变性的(非常简短的)讨论。

看起来更好的方法是:

let newAccess = Object.assign({}, this.state.access, {hospital_id:1});
this.setState({access: newAccess});
看起来你是对的。更新了答案并将接受的答案更改为@FakeRainBrigand
2021-05-11 02:17:53
这不是在改变状态吗?
2021-05-14 02:17:53

另一种方法是

const newAccess = {...this.state.access};
newAccess.hospital_id = 1;
setState({access: newAccess});

使用扩展运算符创建this.state.access.

无论如何,我也遇到了同样的问题(不是相同的上下文),我在自己的工作中做了下面的代码,它工作得很好

this.setState({
  access: {
    ...this.state.access,
    hospital_id: 1,
  },
});