如何将属性设置为数组初始状态?

时间:2017-05-01 09:13:07

标签: immutable.js

在我的减速机中,我通过以下方式设置初始状态:

const initialState = fromJS({
  results: [],
});

但是,如果我尝试按

打印结果
  

initialState.get( '结果')

我得到不可变地图

另一方面,如果在我的reducer中(听一个动作)我通过

设置数组
...
case LOAD_SUCCESS:
  return state
     .set('results', []);
...

执行后,数组将是实际(非永久)数组

  

state.get( '结果')

(例如,通过重新选择定义的选择器)

为什么吗

2 个答案:

答案 0 :(得分:2)

来自fromJS文档:

  

将普通的JS对象和数组深深地转换为不可变的地图和列表。

即,fromJS({ results: [] })等于Map({ results: List([])})

只要您致电state.set('results', []),就可以用普通数组List([])替换[]

这是新手的经典陷阱。

我看到它的方式是你必须选择总是在那里使用List,或者使用普通数组。

列出方式

初始化:const state = fromJS({results: []})

减少:return state.update("results", list => list.clear())

阵列方式#1

初始化:const state = fromJS({results: null})

INIT reduce(调度一次,到init状态)return state.set("results", [])

减少:return state.set("results", [1, 2, 3])

阵列方式#2

初始化:const state = Map({results: []})

减少:return state.set("results", [1, 2, 3])

我建议始终使用数组方式#2 。它会添加更多代码,因为您必须为每个州的字段控制List / Map,但它可以保证您获得所需的内容。

最终会出现这样的事情:

const initialState = Map({ results: [], some_field_as_list: List([]), some_field_as_map: Map([]), ... // etc });

答案 1 :(得分:0)

fromJS({ results: [] })等于Map({ results: List([])})

使用state.set('results', [])List([])替换为普通的[]

在这种情况下,我发现这很有帮助:

  • 初始化:const state = fromJS({results: []})

  • 减少:return state.set('results', List([1,2,3]));

这比使用普通数组更好,因为稍后您可以使用setIn函数编辑相同的state变量:

  • return state.setIn(['results',state.get("results").size], nextElement);

  • return state.setIn(['results',-1], lastElement);