在我的减速机中,我通过以下方式设置初始状态:
const initialState = fromJS({
results: [],
});
但是,如果我尝试按
打印结果initialState.get( '结果')
我得到不可变地图。
另一方面,如果在我的reducer中(听一个动作)我通过
设置数组...
case LOAD_SUCCESS:
return state
.set('results', []);
...
执行后,数组将是实际(非永久)数组:
state.get( '结果')
(例如,通过重新选择定义的选择器)
为什么吗
答案 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);