Redux介绍
Redux 是React最常用的集中状态管理工具,类似于Vue中的Pinia(Vuex),可以独立于框架运行 作用:通过集中管理的方式管理应用的状态
为什么要使用Redux?
独立于组件,无视组件之间的层级关系,简化通信问题
单项数据流清晰,易于定位bug
调试工具配套良好,方便调试
Redux快速体验
1. 实现计数器
需求:不和任何框架绑定,不使用任何构建工具,使用纯Redux实现计数器
使用步骤:
定义一个 reducer 函数 (根据当前想要做的修改返回一个新的状态)
使用createStore方法传入 reducer函数 生成一个store实例对象
使用store实例的 subscribe方法 订阅数据的变化(数据一旦变化,可以得到通知)
使用store实例的 dispatch方法提交action对象 触发数据变化(告诉reducer你想怎么改数据)
使用store实例的 getState方法 获取最新的状态数据更新到视图中
代码实现:
<button id="decrement">-</button>
<span id="count">0</span>
<button id="increment">+</button>
<script src="https://unpkg.com/redux@latest/dist/redux.min.js"></script>
<script>
// 定义reducer函数
// 内部主要的工作是根据不同的action 返回不同的state
function counterReducer (state = { count: 0 }, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 }
case 'DECREMENT':
return { count: state.count - 1 }
default:
return state
}
}
// 使用reducer函数生成store实例
const store = Redux.createStore(counterReducer)
// 订阅数据变化
store.subscribe(() => {
console.log(store.getState())
document.getElementById('count').innerText = store.getState().count
})
// 增
const inBtn = document.getElementById('increment')
inBtn.addEventListener('click', () => {
store.dispatch({
type: 'INCREMENT'
})
})
// 减
const dBtn = document.getElementById('decrement')
dBtn.addEventListener('click', () => {
store.dispatch({
type: 'DECREMENT'
})
})
</script>2. Redux数据流架构
Redux的难点是理解它对于数据修改的规则, 下图动态展示了在整个数据的修改中,数据的流向
为了职责清晰,Redux代码被分为三个核心的概念,我们学redux,其实就是学这三个核心概念之间的配合,三个概念分别是:
state: 一个对象 存放着我们管理的数据
action: 一个对象 用来描述你想怎么改数据
reducer: 一个函数 根据action的描述更新state
Redux与React - 环境准备
Redux虽然是一个框架无关可以独立运行的插件,但是社区通常还是把它与React绑定在一起使用,以一个计数器案例体验一下Redux + React 的基础使用
1. 配套工具
在React中使用redux,官方要求安装俩个其他插件 - Redux Toolkit 和 react-redux
Redux Toolkit(RTK)- 官方推荐编写Redux逻辑的方式,是一套工具的集合集,简化书写方式
react-redux - 用来 链接 Redux 和 React组件 的中间件

2. 配置基础环境
使用 CRA 快速创建 React 项目
安装配套工具
启动项目
3. store目录结构设计

通常集中状态管理的部分都会单独创建一个单独的
store目录应用通常会有很多个子store模块,所以创建一个
modules目录,在内部编写业务分类的子storestore中的入口文件 index.js 的作用是组合modules中所有的子模块,并导出store
Redux与React - 实现counter
1. 整体路径熟悉

2. 使用React Toolkit 创建 counterStore
3. 为React注入store
react-redux负责把Redux和React 链接 起来,内置 Provider组件 通过 store 参数把创建好的store实例注入到应用中,链接正式建立
4. React组件使用store中的数据
在React组件中使用store中的数据,需要用到一个钩子函数 - useSelector,它的作用是把store中的数据映射到组件中,使用样例如下:

5. React组件修改store中的数据
React组件中修改store中的数据需要借助另外一个hook函数 - useDispatch,它的作用是生成提交action对象的dispatch函数,使用样例如下:

Redux与React - 提交action传参
需求:组件中有俩个按钮
add to 10和add to 20可以直接把count值修改到对应的数字,目标count值是在组件中传递过去的,需要在提交action的时候传递参数
实现方式:在reducers的同步修改方法中添加action对象参数,在调用actionCreater的时候传递参数,参数会被传递到action对象payload属性上

Redux与React - 异步action处理
需求理解 
实现步骤
创建store的写法保持不变,配置好同步修改状态的方法
单独封装一个函数,在函数内部return一个新函数,在新函数中 2.1 封装异步请求获取数据 2.2 调用同步actionCreater传入异步数据生成一个action对象,并使用dispatch提交
组件中dispatch的写法保持不变
代码实现
Redux调试 - devtools
Redux官方提供了针对于Redux的调试工具,支持实时state信息展示,action提交信息查看等

美团小案例
1. 案例演示

基本开发思路:使用 RTK(Redux Toolkit)来管理应用状态, 组件负责 数据渲染 和 dispatch action
2. 准备并熟悉环境
克隆项目到本地(内置了基础静态组件和模版)
安装所有依赖
启动mock服务(内置了json-server)
启动前端服务
3. 分类和商品列表渲染
1- 编写store逻辑
2- 组件使用store数据
4. 点击分类激活交互实现
1- 编写store逻辑
2- 编写组件逻辑
5. 商品列表切换显示

6. 添加购物车实现
1- 编写store逻辑
2- 编写组件逻辑
7. 统计区域实现

实现思路
基于store中的cartList的length渲染数量
基于store中的cartList累加price * count
购物车cartList的length不为零则高亮
8. 购物车列表功能实现

1-控制列表渲染
2- 购物车增减逻辑实现
3-清空购物车实现
9. 控制购物车显示和隐藏

Last updated
Was this helpful?