在线文档教程

三个原则(Three Principles)

三个原则(Three Principles)

Redux可以用三个基本原则来描述:

单一的事实来源

整个应用程序的状态 存储在单个存储区中的对象树中

这使得创建通用应用程序变得很容易,因为您的服务器的状态可以被序列化并融入客户端,而无需额外的编码工作。单个状态树还使调试或检查应用程序变得更加容易; 它还使您能够持续开发您的应用程序状态,从而缩短开发周期。一些传统上难以实现的功能 - 例如撤消/重做 - 如果您的所有状态都存储在单个树中,则可能会突然变得无用。

console.log(store.getState()) /* Prints { visibilityFilter: 'SHOW_ALL', todos: [ { text: 'Consider using Redux', completed: true, }, { text: 'Keep all state in a single tree', completed: false } ] } */

状态是只读的

改变状态的唯一方法是发出一个动作,一个描述发生事件的对象。

确保了视图和网络回调都不会直接写入状态。相反,他们表达了转变状态的意图。因为所有的变化都是集中的,并且以严格的顺序依次发生,所以没有细微的竞争条件需要注意。由于动作只是普通的对象,因此可以对其进行记录,序列化,存储以及稍后重放以用于调试或测试目的。

store.dispatch{ type: 'COMPLETE_TODO', index: 1 }) store.dispatch{ type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_COMPLETED' })

使用纯功能进行更改

要指定状态树如何通过操作进行转换,您需要编写纯粹的 reducer。

Reducers只是一个纯函数,它会采用先前的状态和一个动作,并返回下一个状态。记住要返回新的状态对象,而不是改变以前的状态。您可以从一个简化器开始,随着您的应用程序的增长,将其分解成更小的简化器,以管理状态树的特定部分。因为reducer只是函数,所以您可以控制它们的调用顺序,传递其他数据,甚至为常见任务(如分页)创建可重用的reducers。

function visibilityFilter(state = 'SHOW_ALL', action) { switch (action.type) { case 'SET_VISIBILITY_FILTER': return action.filter default: return state } } function todos(state = [], action) { switch (action.type) { case 'ADD_TODO': return [ ...state, { text: action.text, completed: false } ] case 'COMPLETE_TODO': return state.map((todo, index) => { if (index === action.index) { return Object.assign{}, todo, { completed: true }) } return todo }) default: return state } } import { combineReducers, createStore } from 'redux' const reducer = combineReducers{ visibilityFilter, todos }) const store = createStore(reducer)

现在你已经知道 Redux 的全部内容了。