Redux是一个将状态表示为(不可变)对象的小型库.通过纯函数传递当前状态来创建一个全新的对象/应用程序状态.
如果你的眼睛在那边呆滞,别担心.总而言之,Redux并不通过修改对象来表示应用程序状态的变化(就像面向对象范例那样).相反,状态变化被表示为输入对象和输出对象(var output = reducer(input)
)之间的关系.如果你变异了input
或output
,你就会使状态无效.
换句话说,不可变性是Redux的一个要求,因为Redux将应用程序状态表示为"冻结的对象快照".有了这discrete snapshots个,你可以保存你的状态,或者反转状态,并且通常对所有状态的改变有更多的"解释".
应用程序的状态被一类称为reducers的纯函数改变了only.减速器有两个重要特性:
function name(state, action) {}
,因此很容易组合:假设这个州是这样的:
var theState = {
_2ndLevel: {
count: 0
}
}
我们想增加计数,所以我们制作了这些减数器
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 Object.assign(
{},
{_2ndLevel: _2ndlevel(state._2ndlevel, action)}
);
}
}
请注意,使用Object.assign({}, ...)
在each reducer中创建一个全新的对象:
假设我们已经将Redux连接到这些还原程序,那么如果我们使用Redux的事件系统来触发状态更改...
dispatch({type: INCR_2ND_LEVEL_COUNT})
.Redux将呼叫:
theNewState = topLevel(theState, action);
注:action
来自dispatch()
现在theNewState
是entirely new object.
注意:您可以使用a library(或new language features)强制执行不变性,或者只需小心不要更改任何内容:d
为了更深入地了解,我强烈推荐你使用Dan Abramov(创作者)的this video号 checkout .它应该能回答你所有挥之不go 的问题.