请大声告诉我,什么是redux!

什么是Redux?

相信学过vue的小伙伴们都对vuex、pinia等状态管理工具非常熟悉,那么在react中有没有一种类似于vuex和pinia的工具呢?那肯定是有滴,不然Facebook脸上也挂不住咱就说是不是😀。这就是大名鼎鼎的redux,Redux 是React最常用的集中状态管理工具,类似于Vue中的Pinia(Vuex),可以独立于框架运行,下图可形象描述redux。

redux上手

redux管理数据流程

Redux把整个数据修改的流程分成了三个核心概念,分别是:state、action和reducer

  1. state - 一个对象 存放着我们管理的数据状态
  2. action - 一个对象 用来描述你想怎么改数据
  3. reducer - 一个函数 根据action的描述生成一个新的state

环境准备

在react中使用redux,推荐使用redux的插件:Redux Toolkitreact-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

由于代码文件过多不方便在网页展示,感兴趣的小伙伴们可以前往仓库地址拉取代码参考参考(个人水平有限,代码难免会有小问题,大家参考就好)

代码地址:gitee.com/pigs-like-p...

总结

  1. 组件中使用哪个hook函数获取store中的数据? useSelector
  2. 组件中使用哪个hook函数获取dispatch方法? useDispatch
  3. 如何得到要提交action对象? 执行store模块中导出的actionCreater方法

本篇文章到这里就结束了,希望对大家了解redux有所帮助,如果有所帮助的话,麻烦大家点赞,关注加收藏支持一下,谢谢大家。

相关推荐
木子七9 分钟前
vue2-vuex
前端·vue
麻辣_水煮鱼12 分钟前
vue数据变化但页面不变
前端·javascript·vue.js
BY—-组态18 分钟前
web组态软件
前端·物联网·工业互联网·web组态·组态
一条晒干的咸魚21 分钟前
【Web前端】实现基于 Promise 的 API:alarm API
开发语言·前端·javascript·api·promise
WilliamLuo1 小时前
MP4结构初识-第一篇
前端·javascript·音视频开发
Beekeeper&&P...1 小时前
web钩子什么意思
前端·网络
啵咿傲1 小时前
重绘&重排、CSS树&DOM树&渲染树、动画加速 ✅
前端·css
前端Hardy1 小时前
HTML&CSS:数据卡片可以这样设计
前端·javascript·css·3d·html
流烟默1 小时前
CSS中Flex布局应用实践总结
前端·css·flex布局
草字2 小时前
uniapp input限制输入负数,以及保留小数点两位.
java·前端·uni-app