bor*_*net 32 javascript immutability reactjs redux angular
为什么Redux中的对象应该是不可变的?我知道一些框架如Angular2将使用onPush并且可以利用不变性来比较视图状态以便更快地呈现,但我想知道是否还有其他原因因为Redux是框架无关的,但它在自己的文档中提到使用不变性(无论框架如何).
感谢任何反馈.
Ash*_*man 28
Redux是一个小型库,它将状态表示为(不可变)对象.和新的状态通过使当前状态通过纯函数来创建一个全新的对象/应用程序状态.
如果你的眼睛釉面那边不用担心.总而言之,Redux不会通过修改对象来表示应用程序状态的变化(就像使用面向对象的范例一样).相反,状态更改表示为输入对象和输出对象()之间的差异var output = reducer(input).如果你改变了,input或者output你使状态无效.
总结另一种方式,不变性是Redux的要求,因为Redux将您的应用程序状态表示为"冻结对象快照".使用这些离散快照,您可以保存状态或反向状态,并且通常对所有状态更改具有更多"记帐".
您的应用状态仅由称为reducer的纯函数类别更改.减速器有两个重要特性:
function name(state, action) {}如此,因此可以很容易地编写它们:假设状态如下:
var theState = {
_2ndLevel: {
count: 0
}
}
Run Code Online (Sandbox Code Playgroud)
我们想增加计数,所以我们制作这些减速器
const INCR_2ND_LEVEL_COUNT = 'incr2NdLevelCount';
function _2ndlevel (state, action) {
switch (action.type) {
case INCR_2ND_LEVEL_COUNT:
var newState = Objectd.assign({}, state);
newState.count++
return newState;
}
}
function topLevel (state, action) {
switch (action.type) {
case INCR_2ND_LEVEL_COUNT:
return Objectd.assign({}, {_2ndLevel: _2ndlevel(state._2ndlevel)});
}
}
Run Code Online (Sandbox Code Playgroud)
注意使用Objectd.assign({}, ...)在每个 reducer中创建一个全新的对象:
假设我们已将Redux连接到这些Reducer,那么如果我们使用Redux的事件系统来触发状态更改......
dispatch({type: INCR_2ND_LEVEL_COUNT})
Run Code Online (Sandbox Code Playgroud)
... Redux将致电:
theNewState = topLevel(theState, action);
Run Code Online (Sandbox Code Playgroud)
注意:action来自dispatch()
现在theNewState是一个全新的对象.
注意:您可以使用库(或新语言功能)强制实现不变性,或者只是小心不要改变任何内容:D
为了更深入一点,我强烈建议您查看Dan Abramov(创作者)的视频.它应该回答你有任何挥之不去的问题.