什么是Redux?
相信学过vue的小伙伴们都对vuex、pinia等状态管理工具非常熟悉,那么在react中有没有一种类似于vuex和pinia的工具呢?那肯定是有滴,不然Facebook脸上也挂不住咱就说是不是😀。这就是大名鼎鼎的redux
,Redux 是React最常用的集中状态管理工具,类似于Vue中的Pinia(Vuex),可以独立于框架运行,下图可形象描述redux。
redux上手
redux管理数据流程
Redux把整个数据修改的流程分成了三个核心概念,分别是:state、action和reducer
- state - 一个对象 存放着我们管理的数据状态
- action - 一个对象 用来描述你想怎么改数据
- reducer - 一个函数 根据action的描述生成一个新的state
环境准备
在react中使用redux,推荐使用redux的插件:Redux Toolkit
和 react-redux
Redux Toolkit
Redux Toolkit是官方推荐的编写Redux逻辑的方法,是一套工具集,可以简化书写方式,并且其内置immer
支持可变式的状态修改,并且内置thunk
有更好的异步处理。
react-redux
是用来连接Redux和React组件的中间件
有了上面的基础之后,接下来通过一个todoList的案例来带大家感受一下什么是redux。
redux实战
首先我们创建一个react项目(过程忽略。。。。)
创建好项目之后,我们安装Redux Toolkit
以及react-redux
依赖。
npm i @reduxjs/toolkit react-redux
使用redux实现todoList
项目目录结构如下
使用RTK创建todosStore
todosStore.js
todosStore.js
import { createSlice } from "@reduxjs/toolkit";
const todosStore = createSlice({
name: "todos",
// 初始状态
initialState: [
{
id: 1,
title: "Learn React",
completed: true,
},
{
id: 2,
title: "Learn Redux",
completed: false,
},
{
id: 3,
title: "Learn Redux-Toolkit",
}
],
// 修改数据的同步方法
reducers: {
addTodos(state, action) {
state.push(action.payload)
},
deleteTodos(state, action) {
return state.filter(item => item.id !== action.payload.id)
},
editTodos(state, action) {
return state.map(item => item.id === action.payload.id ? action.payload : item)
}
}
})
const { addTodos, deleteTodos, editTodos } = todosStore.actions
export { addTodos, deleteTodos, editTodos }
export default todosReducer
这段代码是一个使用Redux Toolkit创建的todos应用的状态管理模块。首先定义了一个名为todos的状态切片,包含初始的todo列表、三个用于修改状态的同步方法(添加、删除、编辑todo),并导出了对应的action creator函数和reducer函数。这些函数可以用来在应用中更新todo列表的状态。
看到这里大家有没有好奇,todosStore
是什么东西?为什么将reducers
中的属性解构出来要用todosStore.actions
?接下来,让我们来输出todosStore
一探究竟。
打印后,我们可以看到reducers
属性中的方法全部都在todosStore
的actions属性中。
store/index.js
js
import { configureStore } from "@reduxjs/toolkit";
import todosReducer from "../modules/todosStore";
// 创建store
const store = configureStore({
reducer: {
todos: todosReducer
}
});
export default store;
这段代码是使用Redux Toolkit的configureStore函数来创建一个Redux store的简单示例。它将之前定义的todosReducer作为reducer传入,以便在store中管理todos相关的状态。最后,它将这个store实例导出,使其可以在应用的其他部分被使用。
那么store到底是什么东西呢?打印store可以看到,store中包含多种内置的方法,我们常见的dispatch和subscribe都被其内置。
将store注入React
react-redux负责把Redux和React 链接 起来,内置 Provider组件 通过 store 参数把创建好的store实例注入到应用中。
React组件中使用store中的数据
在React组件中使用store中的数据,需要用到一个 钩子函数 useSelector
,它的作用是把store中的数据映射到组件 中,使用样例如下:
React组件中修改store中数据
React组件中修改store中的数据需要借助另外一个hook函数 useDispatch
,它的作用是生成提交action对象的 dispatch函数,使用样例如下:
redux调试工具的使用
在编写redux时,我们不能直观的在编译器观察到数据的变化,为了解决这个问题,redux官方提供了针对于Redux的调试工具,支持实时state信息展示,action提交信息查看等。只需要在浏览器安装redux devtools即可,下面给大家展示展示效果。
使用redux使用todoList
由于代码文件过多不方便在网页展示,感兴趣的小伙伴们可以前往仓库地址拉取代码参考参考(个人水平有限,代码难免会有小问题,大家参考就好)
总结
- 组件中使用哪个hook函数获取store中的数据? useSelector
- 组件中使用哪个hook函数获取dispatch方法? useDispatch
- 如何得到要提交action对象? 执行store模块中导出的actionCreater方法
本篇文章到这里就结束了,希望对大家了解redux有所帮助,如果有所帮助的话,麻烦大家点赞,关注加收藏支持一下,谢谢大家。