请大声告诉我,什么是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有所帮助,如果有所帮助的话,麻烦大家点赞,关注加收藏支持一下,谢谢大家。

相关推荐
蔓越莓几秒前
[Electron] win.setSize 在RTL布局下的表现,是否需要适配?
前端·electron
Json_5 分钟前
Vue 实例方法
前端·vue.js·深度学习
数据攻城小狮子6 分钟前
Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现
java·前端·spring boot·后端·maven·intellij-idea
阿鲁冶夫19 分钟前
最佳实践初始化项目公用cli
前端
Json_33 分钟前
实例入门 实例属性
前端·深度学习
Json_34 分钟前
JS中的apply和arguments小练习
前端·javascript·深度学习
云只上1 小时前
前端界面在线excel编辑器 。node编写post接口获取文件流,使用传参替换表格内容展示、前后端一把梭。
前端·javascript·node.js·excel
Json_1 小时前
Vue Methods Option 方法选项
前端·vue.js·深度学习
刘 怼怼1 小时前
使用 Vue 重构 RAGFlow 实现聊天功能
前端·vue.js·人工智能·重构
Json_1 小时前
Vue v-bind指令
前端·vue.js·深度学习