React中复杂状态的深度合并

zmi*_*mii 4 javascript ecmascript-6 reactjs

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

  getInitialState: function() {
    return {
      isValid: false,
      metaData: {
        age: 12,
        content_type: 'short_url'
      }
    };
  },
Run Code Online (Sandbox Code Playgroud)

我用setState这样更新状态:

...
let newMetaData = {  age: 20 };
...
this.setState({
        isValid: true,
        metaData: newMetaData
      });
...
Run Code Online (Sandbox Code Playgroud)

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

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

DTi*_*ing 5

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

this.setState({
  metaData: Object.assign({}, this.state.metaData, newMetaData),
});
Run Code Online (Sandbox Code Playgroud)

或者如果使用传播:

this.setState({
  metaData: { ...this.state.metaData, ...newMetaData },
});
Run Code Online (Sandbox Code Playgroud)

  • 扩展运算符合并不是"深度"合并,这意味着合并是递归的.此外,嵌套对象属性未合并REF:https://davidwalsh.name/javascript-deep-merge (5认同)