How do I setState for nested object?

后端 未结 5 629
鱼传尺愫
鱼传尺愫 2020-11-29 20:36

For a plugin I\'m using I have to have a state that looks like this:

getInitialState() {
  return {
    invalid: true,
    access: {
      access_code: \'\',         


        
相关标签:
5条回答
  • 2020-11-29 20:55

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

    0 讨论(0)
  • 2020-11-29 21:02

    My preferred way of doing this now is as simple as:

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

    Slightly simpler than the current accepted answer.

    EDIT (based on the question from @SILENT )

    It looks like this is actually a potentially dangerous method. Further reading here React: A (very brief) talk about immutability.

    Looks like a better way to do this would be:

    let newAccess = Object.assign({}, this.state.access, {hospital_id:1});
    this.setState({access: newAccess});
    
    0 讨论(0)
  • 2020-11-29 21:05

    You have a few options:

    1. With ECMA6, you can use the Object spread proposal (...) to create copies of objects with updated properties.

      this.setState({
        access: {
          ...this.state.access,
          hospital_id: 1,
        },
      });
      
    2. You can use the native assign function on the Object (Object.assign())

      this.setState({
        access: Object.assign({}, this.state.access, {
          hospital_id: 1,
        }),
      });
      
    3. Or for the shortest version and atomic update:

       this.setState(({access}) => ({access: {
         ...access,
         hospital_id: 1,
       }});
      
    4. And one more option is the updates addon:

      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},
        })
      });
      

    I would recommend using the first one.

    0 讨论(0)
  • 2020-11-29 21:09

    I had this same issue too(not the same context) anyways, i did the code below in my own work and it worked perfectly

    this.setState({
      access: {
        ...this.state.access,
        hospital_id: 1,
      },
    });
    
    0 讨论(0)
  • 2020-11-29 21:12

    Another way to do this would be

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

    Use of the spread operator creates a clone of this.state.access.

    0 讨论(0)
提交回复
热议问题