1. Redux的简介
Redux 是 JavaScript 状态容器,提供可预测化的状态管理,可用于不同 JavaScript 应用程序中。Redux 的设计思路是单一数据源,即整个应用只有唯一 Store,所有状态都存储在 Store 中,通过派发(dispatch)action 来改变这个唯一的数据源,从而达到控制整个应用的状态和逻辑的目的。
Redux 在官方文档中提供了一张图,也是 Redux 设计架构中最重要的三个元素:store、action 和 reducer。
上图解释了 Redux 的数据流向:用户调用视图层的函数,从而创建一个 Action。Action 通过 store.dispatch 函数被发出,进而调用 Reducer 来更新 Store 中的状态。Store 状态更新之后,视图层自动更新;视图层后续的函数再次被调用,从而共同形成一个完整的闭环。
2. Redux 的由来
Redux 诞生于 2015 年的 React Europe 大会,由于 Redux 设计简单,易于理解和使用,在很短时间内就成为了 React 生态圈中不可或缺的一部分。
Redux 的核心开发者 Dan Abramov 也是 React Redux 的核心开发者,目前在 Facebook 工作,撰写过多篇关于 React 和 Redux 的优秀文章,在 Redux 的 Github 主页上有着 17 万个以上的 Star 。
3. Redux 的应用场景
Redux 很适用于以下场景:
3.1 应用状态较为复杂
当你的应用状态较为复杂,存在多个组件之间的相互通信,且前端数据需在多个视图间共享时,Redux 会是一种很合适的选择。
3.2 单一状态树的管理
Redux 适用于单一状态,即整个应用只有一个数据源。因为在 Redux 中,所有的 State 都存放在 Store 中,我们可以非常方便地进行状态管理。
3.3 状态不可变
Redux 强调状态是只读的,不能直接被修改。这是因为 Redux 依赖数据的不可变性来帮助 React 在遇到性能问题时优化 diff 运算。因此如果你的数据的属性在定义之后不会再被改变,Redux 正好可以胜任。
4. Redux 的使用
下面简单地介绍下 Redux 的使用:
4.1 安装 Redux
首先你需要将 Redux 安装到你的项目中,你可以使用 npm,也可以使用 Yarn 进行安装:
npm install redux
// 或者
yarn add redux
4.2 Store 的创建
在创建一个 Redux Store 之前,你需要先定义出这个状态树和 Reducer:
import { createStore } from 'redux'
const initialState = {
count: 0,
text: ''
}
const reducer = (state = initialState, action) => {
switch (action.type) {
case 'INCREMENT':
return {
...state,
count: state.count + 1
}
case 'DECREMENT':
return {
...state,
count: state.count - 1
}
case 'CHANGE_TEXT':
return {
...state,
text: action.text
}
default:
return state
}
}
const store = createStore(reducer)
export default store
如上所示,你需要在代码中定义一个初始状态 initialState,还需要定义一个 Reducer,将当前的 state 和 Action 作为参数,用来返回新的 state。
之后使用 createStore 函数来创建一个 Store,这个 Store 会将接收到的 Action 分发给 Reducer,并根据 Reducer 返回的新 State 来更新应用的状态。
4.3 Reducer 的编写
Reducer 是定义如何响应 Action 并更新应用状态的函数。Reducer 接收两个参数,当前的状态 state 和要执行的 Action。Reducer 必须返回一个新的状态对象。
const initialState = {
count: 0,
text: ''
}
const reducer = (state = initialState, action) => {
switch (action.type) {
case 'INCREMENT':
return {
...state,
count: state.count + 1
}
case 'DECREMENT':
return {
...state,
count: state.count - 1
}
case 'CHANGE_TEXT':
return {
...state,
text: action.text
}
default:
return state
}
}
如上所示,根据业务逻辑编写 Reducer,返回新的状态。在这个例子中,我们通过返回一个新的 State 对象改变了计数器中的值,并更新了文本。
4.4 Store 和 Action 的结合使用
可以使用 store.subscribe 方法创建回调函数,该方法在 store 常规操作中被发生时调用。我们也可以使用 store.dispatch 方法来触发一个 action。
import store from './store'
store.subscribe(() => {
console.log(store.getState())
})
const incrementAction = { type: 'INCREMENT' }
store.dispatch(incrementAction)
如上所示,我们首先指定回调函数,然后 dispatch 一个 INCREMENT 的 action 来增加值,并在控制台上打印更新的状态。
5. 总结
Redux 在 React 应用开发过程中具有很重要的作用,当应用的状态变得较为复杂或组件之间需要共享状态时,使用 Redux 可以有效地解决这些问题。此外,Redux 的设计思路清晰简单,易于理解,可以帮助开发者更好地管理应用状态。