跳到主要内容

三大原则

动机

随着 JavaScript 单页应用开发日趋复杂,我们的编码要管理的 state(状态)比以往任何时候都要多

管理不断变化的 state 非常困难。如果一个 State 的变化会引起另一个 State 变化,那么当 view 变化时,就可能引起对应 State 以及另一个 State 的变化,这个变化反过来又可能引起另一个 view 的变化。当这些连锁反应到一定程度之后,你根本搞不清楚到底发生了什么。state 在什么时候,由于什么原因,如何变化已然不受控制。 当系统变得错综复杂的时候,想重现问题或者添加新功能就会变得举步维艰。

Redux 试图让 state 的变化变得可预测。这些限制条件体现在 Redux 的三大原则中。

单一数据源

整个应用的 全局 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。

这条原则简化了同构应用的开发,因为在服务端的 state 可以序列化并注入到客户端,不需要做其他的一些事情。一个单一数据源 state tree 也简化了应用的调试和和监控;它也让你在开发中能将应用数据持久化到本地,从而加速开发周期。此外,有一些功能以前很难实现,比如“撤销/重做”,在单一数据源的原则下,使用 Redux 实现将非常容易。

State 是只读的

唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。

使用纯函数来执行"修改"

为了描述 action 如何改变 state tree,你需要编写纯的 reducers。

Reducer 是纯函数,它接收之前的 state 和 action,并返回新的 state。记住,一定要返回一个新的对象,而不是修改之前的 state。你一开始可以只有单个 reducer,但随着应用复杂度的增长,你可以把大的 reducer 划分为一个个小的 reducers,分别管理着 state tree 的不同部分。由于 reducer 只是函数,你可以控制它们被调用的顺序,传入附加数据,甚至编写可复用的 reducer 来处理一些通用任务,如分页器。