基本减速器结构与样式( Basic Reducer Structure and State Shape )
基本减速器结构与样式( Basic Reducer Structure and State Shape )
基本减速机结构
首先,重要要明白,你的整个应用程序实际上只有一个 reducer 函数
:createStore
作为第一个参数传入的函数。单一的reducer功能最终需要做几件事情:
- 减速器第一次被调用时,
state
值将会是undefined
。在处理传入动作之前,reducer需要通过提供默认状态值来处理这种情况。
- 它需要查看以前的状态和派遣的行动,并确定需要完成哪些工作
- 假设需要进行实际更改,则需要使用更新后的数据创建新对象和数组,并返回这些数据
- 如果不需要更改,它应该按原样返回现有状态。
编写Reducer逻辑最简单的方法是将所有内容放入单个函数声明中,如下所示:
function counter(state, action) {
if (typeof state === 'undefined') {
state = 0; // If state is undefined, initialize it with a default value
}
if (action.type === 'INCREMENT') {
return state + 1;
}
else if (action.type === 'DECREMENT') {
return state - 1;
}
else {
return state; // In case an action is passed in we don't understand
}
}
注意这个简单的功能满足了所有的基本要求。如果不存在,它会返回一个默认值,初始化商店; 它根据动作类型确定需要进行哪种更新并返回新值; 如果不需要完成工作,它将返回以前的状态。
这个减速器可以做一些简单的调整。首先,重复if
/ else
很快就会令人厌烦,所以使用switch
非常常见。其次,我们可以使用ES6的默认参数值来处理最初的“不存在数据”情况。随着这些变化,减速器将如下所示:
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
return state;
}
}
这是典型的Redux减速器功能使用的基本结构。
基本状态形状
Redux鼓励您根据需要管理的数据考虑您的应用程序。任何时间点的数据都是应用程序的“ 状态
”,并且该状态
的结构和组织通常称为其“ 形状
”。你的状态
在你如何构建你的reducer逻辑中起着重要的作用。
Redux状态通常有一个简单的Javascript对象作为状态树的顶部。(当然也可能有其他类型的数据,例如单个数字,数组或特定的数据结构,但大多数库都假定顶层的值是一个普通的对象。)最常见的组织方式为顶级对象内的数据将进一步将数据划分为子树,其中每个顶级键代表相关数据的某个“域”或“切片”。例如,一个基本的Todo应用程序的状态可能如下所示:
{
visibilityFilter: 'SHOW_ALL',
todos: [
{
text: 'Consider using Redux',
completed: true,
},
{
text: 'Keep all state in a single tree',
completed: false
}
]
}
在这个例子中,todos
和visibilityFilter
都是状态中的顶级密钥,并且每个密钥都代表某个特定概念的“切片”数据。
大多数应用程序处理多种类型的数据,大致可以分为三类:
域数据
:应用程序需要显示,使用或修改的数据(例如“从服务器检索到的所有Todos”)
应用程序状态
:特定于应用程序行为的数据(例如“当前选择了待办事项#5”或“请求正在处理获取待办事项”)
用户界面状态
:表示用户界面当前如何显示的数据(如“EditTodo模式对话框当前处于打开状态”)
由于商店代表了应用程序的核心,因此应该根据域数据和应用程序状态定义状态形状,而不是您的UI组件树。 作为一个例子,state.leftPane.todoList.todos的形状并不是一个好主意,因为“todos”的概念是整个应用程序的核心,而不仅仅是UI的一个部分。 待办事项切片应位于状态树的顶部。
将有很少
是你的 UI 树和你的状态形状之间的1对1的对应关系。这个例外情况可能是,如果您明确地跟踪 Redux 存储中 UI 数据的各个方面,但即使如此,UI 数据的形状和域数据的形状也可能不同。
一个典型的应用程序的状态可能大致如下所示:
{
domainData1 : {},
domainData2 : {},
appState1 : {},
appState2 : {},
ui : {
uiState1 : {},
uiState2 : {},
}
}