不可变JS - getIn()返回undefined但在浏览器中使用浏览器

时间:2016-08-26 16:05:20

标签: reactjs reactjs-flux immutable.js

以下是我的代码中的代码段:

this.state = {
      data: Immutable.Map({
        gender: "",
        provinces: Immutable.Map(),
        activeProvince: this.props.defaultProvince,
        activeCity: this.props.defaultCity,
      })
    }


let cities = this.state.data.getIn(['provinces', '354']);


The structure would look like this:

state{

  gender: "",
  activeProvince: "354",
  provinces: { 
    354: { 
      name: "abc",
      cities: Immutable.Map()
    }, 

    123: { 
      name: "def", 
      cities: Immutable.Map() 
    }
}

获得省份'只返回一个大小为87的Map,这意味着它有值,但是更深一级会给我一个未定义的。从浏览器在控制台中完成它可以得到预期的结果。

我是在"返回"

之前的render()中完成的
render(){

    let provinces = this.state.data.get('provinces')
      .sortBy( province => province.get('name') )
      .map( (value, key) => {
        return { text: value.get('name'), value: key }
      });

    // Supposed to do the same thing as above (provinces)
    // with ['provinces'] only it returns a value, adding '354' returns undefined.
    let cities = this.state.data.getIn(['provinces', '354']);

    console.log(cities);

- 编辑 -

通过执行' toObject()'将省份地图转换为对象显示密钥存在,为什么getIn(' provinces,' 354')显示未定义?

1 个答案:

答案 0 :(得分:1)

当我尝试重现您的问题时,我注意到provinces键及其一级子项是不可变的,但namecities键实际上是可变的。这就是为什么我在包含sortBy函数的行上出错了。要解决此问题,您需要使用provinces而不是Immutable.fromJS()定义Immutable.Map()Immutable.Map()仅将对象转换为一个级别的不可变对象。但是,Immutable.fromJS()会将所有级别转换为不可变级别。