本文将先介绍redux
的一些基础概念,然后再聊聊其中的核心理念和相关原则。
Redux 的构成
我们知道,
redux
由Store
、Reducer
、Action
三个部分组成。其中,Action
是把数据从应用(视图)传到store
的有效载体,是store
数据的唯一来源;Reducer
则指定了应用状态的变化如何响应actions
并发送到store
,换句话说:"actions 只是描述了有事情发生这一事实,而 reducer 则是描述应用如何更新 reducer。"
一些使用原则
store 唯一
当我们使用redux
的时候,我们的整个state
被储存在一个Object
中,并且这个Object
只存在于唯一的一个store
中。
js
console.log(store.getState())
/* 输出
{
visibilityFilter: 'SHOW_ALL',
todos: [
{
text: 'Consider using Redux',
completed: true,
},
{
text: 'Keep all state in a single tree',
completed: false
}
]
}
*/
State 只读
我们不能直接修改
State
唯一改变State
的方法就是触发Action
,Action
是一个用于描述已发生事件的普通对象。
这样做有几个好处:
action
仅表达修改意图,视图和网络请求都不能直接修改state
,不会出现修改顺序的问题。action
本身只是对象,可获取可操作。
Action 常见的结构如下
js
{
type: 'xxxx',
body: 'xxxx'
}
所以我们可以通过如下函数很容易的制造 Action
ts
const actionCreator = type => body => ({type, body});
调用的话执行两个函数就行。
使用纯函数来执行修改
我们知道action
只是描述,真正对state
做更改的具体行为还是reducer
,Reducer 只是一些纯函数,它接收先前的 state 和 action,并返回新的 state。
举个例子:
js
function visibilityFilter(state = 'SHOW_ALL', action) {
switch (action.type) {
case 'SET_VISIBILITY_FILTER':
return action.filter
default:
return state
}
.........
}
特性
单向数据流
严格的单向数据流意味着应用中所有的数据都遵循相同的生命周期,这样可以让应用变得更加可预测且容易理解。同时也鼓励做数据范式化,这样可以避免使用多个且独立的无法相互引用的重复数据。
redux 生命周期
- 我们调用
store.dispatch(action)
;
这里就是在说,我们需要做一个啥事情,
- Redux store调用传入的reducer函数
这里就是先进行计算一下:Store 会把两个参数传入 reducer: 当前的 state 树和 action。
Store 会把两个参数传入 reducer: 当前的 state 树和 action。
- 根 reducer 应该把多个子 reducer 输出合并成一个单一的 state 树。
把多个计算结果统一
- Redux store 保存了根 reducer 返回的完整 state 树。
得到结果
那么这就是本篇文章的全部内容啦,我们从基本概念聊到了核心原则,然后聊到了Redux
的一些特性,下一篇文章我们会聊一些Redux
的使用~