immutable.js& react.js setState清除对象的原型

时间:2015-07-18 02:11:40

标签: javascript reactjs immutable.js

我在组件中有以下代码:

constructor() {
    this.state = Immutable.fromJS({
            user : {
                wasChanged : false,
                firstName : false,
                lastName : false,
                address : {
                    street : false,
                }
            }
        });
}
onEdit({target: {dataset: {target}}}, value) {
      this.setState(function (prevState) {
          return prevState.setIn(['user', target], value);
        });
  }
render() {
    var user = this.state.get('user').toJS();
    ...
}

问题在于,当我尝试更新 onEdit 中的值时,我发现 prevState 具有不同的原型集。我不明白为什么或我做错了什么。我在控制台中看到了这个

> Object.getPrototypeOf(this.state)
src_Map__Map {@@__IMMUTABLE_MAP__@@: true}

> Object.getPrototypeOf(prevState)
Object {}

状态改变后,它会进行渲染,当然无法找到 get 函数或者来自Immutable的任何内容

使用与插件的反应0.13.3。

2 个答案:

答案 0 :(得分:6)

把它作为国家的关键。

this.state = {
  data: Immutable...
};

目前你不能使用Immutable对象作为状态的原因与你不能做this.state = 7的原因相同:它不是一个普通的JavaScript对象。

粗略地说,操作如下:

React.Component.prototype.setState = (changes) => {
  batchUpdate(() => {
    // copies own properties from state to the new object
    // and then own properties from changes to the new object
    var nextState = Object.assign({}, state, changes);

    this.componentWillUpdate(...);
    this.state = nextState;
    queueDomUpdateStuff(this.render(), () => this.componentDidUpdate());
  });
};

答案 1 :(得分:2)

组件'state应该是一个普通的JavaScript对象;该对象的可以是不可变值。在issue 3303中讨论了支持不可变值的状态。