最近在某项目中欲选一工具用作项目的全局状态管理,通过综合比较考虑,最终选择了
Redux。都说 Redux 难上手,今天通过 1 个案例, 3 个函数帮小伙伴们快速掌握并实践生产!

作为一名前端工程师,不少小伙伴对于 Redux 的概念、使用可能还是比较模糊,上手使用的心智负担也比较重!
但通过调研,目前 Redux 的生态可以说是非常丰富,这也使得将其引入作为项目的状态管理工具库变得 更加容易。
本文通过实际案例反向释义 Redux 中的名词概念,同时借助 @reduxjs/toolkit 模块简化 Redux 的使用,希望通过今天的分享可以帮助大家打开心结,抱抱 Redux,提升工作效率,从此不加班!

一、Redux 基础
一开始就阐释概念名词,可能会增加大家上手的难度,因此该部分只对 Redux 做最基本的一个认识。
1.1 什么是 Redux ?
Redux 是
JavaScript状态容器,提供 可预测、可调试、集中式 的状态管理。
1.2 特点

- 可预测: 让你开发出 行为稳定可预测、可运行在不同环境 (客户端、服务端和原生程序)、且 易于测试 的应用。
- 集中管理: 集中管理应用的状态和逻辑可以让你开发出强大的功能,如 撤销/重做、 状态持久化 等等。
- 可调试: Redux DevTools 让你 轻松追踪 到 应用的状态在何时、何处以及如何改变。Redux 的架构会记下每一次改变,借助于 "时间旅行调试",你甚至可以把完整的错误报告发送给服务器。
- 灵活: Redux 可与任何 UI 层框架搭配使用,它体小精干(只有
2kB,包括依赖),并且有 庞大的插件生态 来实现你的需求。
1.3 设计思想
Redux 既然是状态管理库,那么接下来掌握一下基本的数据流概念和原则
(1) 单一数据源
整个应用的 全局 state 被储存在一棵对象树(object tree)中,并且这个对象树只存在于唯一 Store(存储) 中
单一数据源使得同构应用开发变得容易,将状态在统一的 对象树 中维护管理也会更加容易!
(2) 单向数据流(one-way data flow)

Redux 单向数据流
- 用
state来描述应用程序在特定时间点的状况 - 基于
state来渲染出View - 当发生某些事情时(例如用户单击按钮),
state会根据发生的事情进行更新,生成新的state - 基于新的
state重新渲染View
(3) 不可变性(Immutability)
对于状态(state)的描述一般都是一个大的 JavaScript 对象(Object Tree),例如:
const state = {
isLoading: true,
userInfo: {
uid: 1,
wechat: 'DYBOY2020',
phone: 177****7777,
history: [1,2,3,4,5]
}
}
由于 JS 的动态性,使得对象是可以修改的,Redux 想要记录每一个状态,如果直接修改 state 中的引用类型属性,势必会导致 state 的变化不可追溯和预测。
因此 state 是只读的!唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。
Redux 期望所有状态更新都是使用不可变的方式,因此,每一次的 state 变更,不会修改原对象,而是修改前一个状态(state)的克隆对象,以此来保证不可变性和正确性,同时记录每一次变化的 state。
(4) 纯函数更新 state
纯函数: 相同的输入,总是会得到相同的输出,并且在执行过程中没有任何副作用的函数。
为了保证数据的改变正确性,以及满足 state 不可变性的要求,因此引入了 纯函数 作为更新状态的唯一方式。
React Hooks 的状态管理就融合了 Redux 的设计思想,毕竟把 Redux 的作者 Dan Abramov 都直接挖过去了


