React中复杂状态的深度合并

时间:2016-11-15 04:05:16

标签: javascript reactjs ecmascript-6

当我声明了以下初始状态时:

  getInitialState: function() {
    return {
      isValid: false,
      metaData: {
        age: 12,
        content_type: 'short_url'
      }
    };
  },

我用这样的setState更新状态:

...
let newMetaData = {  age: 20 };
...
this.setState({
        isValid: true,
        metaData: newMetaData
      });
...

结果this.state.metadata对象仅定义了年龄。但据我所知,this.setState()将其参数合并到现有状态。为什么它不在这里工作,这不应该是经常合并的吗?

有没有办法在React / ES6中将新对象属性合并到状态对象属性?

1 个答案:

答案 0 :(得分:6)

setState执行浅合并。如果metaData是平的:

this.setState({
  metaData: Object.assign({}, this.state.metaData, newMetaData),
});

或者如果使用传播:

this.setState({
  metaData: { ...this.state.metaData, ...newMetaData },
});