Redux和Redux Toolkit

news2025/9/21 23:50:37

Redux

  1. 概念:redux是react最常用的集中状态管理工具,类似于Vue中的Pinia(vuex),可以独立于框架运行
  2. 作用:通过集中管理的方式管理应用的状态

Redux快速体验

  1. 不和任何框架绑定,不使用任何构建工具,使用纯Redux实现计数器
  2. 使用步骤:
    • 定义一个reducer函数 (根据当前想要做的修改返回一个新的状态)
    • 使用createStore方法传入 reducer函数 生成一个store实例对象
    • 使用store实例的 subscribe 方法订阅数据的变化 (数据一旦变化,可以得到通知)
    • 使用store实例的 dispatch 方法提交action对象 触发数据变化 (告诉reducer你想怎么改数据)
    • 使用store实例的 getState方法 获取最新的状态数据更新到视图中

Redux管理数据流程梳理

在这里插入图片描述
为了职责清晰,数据流向明确,Redux把整个数据修改的流程分为了三个核心概念,分别是: state,action,和reducer

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

Redux 在 React中使用

在react中使用redux,官方要求安装两个其他插件 - Redux Toolkit 和 react-redux

  1. Redux Toolkit (RTK) - 官方推荐编写Redux逻辑的方式,是一套工具的集合集,简化书写方式在这里插入图片描述
  2. react-redux - 用来 链接 redux 和 react 组件的中间件在这里插入图片描述
  3. 官方推荐的使用 React 和 Redux 创建新应用的方式是使用 官方 Redux+JS 模版或 Redux+TS 模板,它基于 Create React App,利用了 Redux Toolkit 和 Redux 与 React 组件的集成.
# Redux + Plain JS template
npx create-react-app my-app --template redux

# Redux + TypeScript template
npx create-react-app my-app --template redux-typescript

深入浅出Redux

基础示例

应用的整体全局状态以对象树的方式存放于单个store。唯一改变状态树 (state tree) 的方法是创建action,一个描述发生了什么的对象,并将其dispatch 给 store。要指定状态树如何相应action来进行更新,你可以编写纯reducer函数,这些函数根据旧state 和 action 来计算新的state

import { createStore } from 'redux'

/**
 * 这是一个 reducer 函数:接受当前 state 值和描述“发生了什么”的 action 对象,它返回一个新的 state 值。
 * reducer 函数签名是 : (state, action) => newState
 *
 * Redux state 应该只包含普通的 JS 对象、数组和原语。
 * 根状态值通常是一个对象。 重要的是,不应该改变 state 对象,而是在 state 发生变化时返回一个新对象。
 *
 * 你可以在 reducer 中使用任何条件逻辑。 在这个例子中,我们使用了 switch 语句,但这不是必需的。
 * 
 */
 function counterReducer (state = {value: 0}, action) {
        switch (action.type) {
        case 'counter/incremented':
          return { value: state.value + 1 }
        case 'counter/decremented':
          return { value: state.value - 1 }
        default:
          return state
      }
 }
// 创建一个包含应用程序 state 的 Redux store.
// 它的 API 有 {subscribe, dispatch, getState}
let store = createStore(counterReducer);
// 你可以使用subscribe() 来更新 UI 以响应 state 的更改
// 通常你会使用视图绑定库 (例如 React Redux) 而不是直接使用 subscribe()。
// 可能还有其他用例对subscribe 也有帮助
store.subscribe(() => console.log(state.getState()))

// 改变内部状态的唯一方法是 dispatch 一个action。
// 这些 action 可以被序列化,记录或储存,然后再重放
store.dispatch({ type: 'counter/incremented' })
// {value: 1}
store.dispatch({ type: 'counter/incremented' })
// {value: 2}
store.dispatch({ type: 'counter/decremented' })
// {value: 1}

你需要使用action这个普通对象来描述发生了什么,而不是直接改变state。然后,编写一个名为reducer的特殊函数,来决定如何基于action来更新整个应用的状态树。

在典型的Redux应用中,只有一个store以及一个根reducer函数。随着应用程序的增长,你可以将根reducer拆分为较小的reducer,分别在状态树的不同部分上进行。这就像React应用程序只有一个根组件一样,但是它是由许多小组件组成的。

对于简单的计数器应用来说,这种架构看起来过度设计,但是这种模式的优点在于它可以很好地扩展到大型和复杂的应用程序。还可以基于此设计出功能非常强大的开发者工具,因为可以跟踪每个 action 以及状态变更。你可以记录用户会话并仅通过重播每个 action 来重现它们。

Redux Toolkit示例

Redux Tookit 简化了编写Redux逻辑和设置store的过程。使用 Redux Toolkit相同逻辑如下所示:

import { createSlice, configureStore } from '@reduxjs/toolkit'

const counterSlice = createSlice({
    // 给仓库起一个独一无二的名字
    name: 'counter',
    // 初始化状态的值
    initialState: {
        value: 0
    },
    // 简化了reducer函数
    reducers: {
        incremented: state => {
            // Redux Toolkit 允许在 reducers 中编写 'mutating' 逻辑。
            // 它实际上并没有改变state,因为使用的是 Immer 库,检测到“草稿 state” 的变化并产生一个全新基于这些更改不可变的 state
            state.value +=1
        },
        decremented: state => {
          state.value -= 1
        }
    }
    
})

// 按需从actions对象中导出 更改状态的方式
export const { incremented, decrenebted } = counterSlice.actions
// 创建store实例,挂载reducer函数
const store = configureStore({
    reducer: counterSlice.reducer
})

// 可以订阅 store
store.subscribe(() => console.log(store.getState()))
// 将我们所创建的 action 对象传递给 `dispatch`
store.dispatch(incremented())
// {value: 1}
store.dispatch(incremented())
// {value: 2}
store.dispatch(decremented())
// {value: 1}
Redux Toolkit 包含什么
  • configureStore():封装了createStore,简化配置项,提供一些现成的默认配置项。它可以自动组合 slice 的 reducer,可以添加任何 Redux 中间件,默认情况下包含 redux-thunk,并开启了 Redux DevTools 扩展。
  • createSlice():接收一组reducer函数的对象,一个slice切片名和初始状态 initial state,并自动生成具有相应action creator 和 action type 的slice reducer
  • createReducer():帮你将action type 映射到 reducer 函数,而不是编写 switch…case语句。另外,它会自动使用immer库来让你使用普通的 mutable 代码编写更简单的immutable更新,例如 state.todos[3].completed = true
  • createAction():生成给定 action type 字符串的 action creator函数。该函数本身已定义了toString(),因此可以代替常量类型使用
  • createAsyncThunk:接收一个 action type 字符串和一个返回值为 promise 的函数, 并生成一个 thunk 函数,这个 thunk 函数可以基于之前那个 promise ,dispatch 一组 type 为 pending/fulfilled/rejected 的 action。
  • createEntityAdapter:生成一系列可复用的 reducer 和 selector,从而管理 store 中的规范化数据。
  • createSelector来源于 Reselect 库,重新 export 出来以方便使用。
Redux Toolkit 注入 React

Redux Toolkit包含一个组件,它使Redux store对应用程序的其余部分可用:

import React from 'react'
import ReactDOM from 'react-dom/client'

import { Provider } from 'react-redux'
import store from './store'

import App from './App'

// As of React 18
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
  <Provider store={store}>
    <App />
  </Provider>
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1583837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kali linux 安装 VirtualBox for Linux Hosts

sudo vim /etc/apt/sources.list deb [archamd64] https://download.virtualbox.org/virtualbox/debian buster contrib添加源文件 sudo apt update sudo apt install linux-headers-$(uname -r) dkms sudo apt install virtualbox virtualbox-ext-pack 扩展包 echo "d…

干货分享|JumpServer三种常见的文件传输方式效果对比

JumpServer开源堡垒机支持对文件的上传和下载&#xff0c;并对传输记录进⾏审计。JumpServer的文件传输功能是用户使用频率较高的功能&#xff0c;常见的文件传输方式包括&#xff1a;rz和sz命令方式、文件管理方式和客户端工具方式。 在使用JumpServer进行文件传输的时候&…

【SpringBoot3】Bean管理

1.Bean扫描 1.1传统Spring 标签&#xff1a;<context:component-scan base-package"com. example "/>注解&#xff1a;ComponentScan(basePackages "com.example") 1.2SpringBoot SpringBoot默认扫描启动类所在的包及其子包 2.Bean注册 如果要注…

Qt 多窗体

前言 在 Qt编程中经常会遇到要在多个界面之间切换的情况&#xff0c;如从登录界面跳转到主界面&#xff0c;从主界面跳转到设置界面&#xff0c;再返回到主界面。我们将会用一个简单的示例来实现多窗体功能。 登录窗口 创建基类为QMainWindow&#xff0c;类名为LoginWin。再使用…

手机放枕边真的很危险吗

从小我的妈妈就告诉我&#xff1a;睡觉的时候手机放枕头边上&#xff0c;辐射会对身体有害&#xff0c;但事实真是这样吗&#xff1f; 首先只要是会发热的物体就都有辐射&#xff0c;但是手机的辐射是电磁辐射&#xff0c;对人无害&#xff0c;它造成的电磁辐射甚至没有太阳造…

【Figma】安装指南及基础操作

先前做UI设计一直都是用PS等绘图软件设计&#xff0c;但发现在纠结像素和排版问题上会花很多时间&#xff0c;再加上AI没来得及上手&#xff0c;就需要迅速出成图&#xff0c;此时通过论坛发现了figma&#xff0c;基本上可以满足足够的需求&#xff0c;并且可以在windows系统上…

编译器如何理解C++的指针和引用?

初学引用时&#xff0c;往往很难真正理解引用&#xff0c;它与指针究竟有什么区别和联系。下面我们不妨看看编译器如何理解引用和指针的。 一.函数通过指针传参 1.1 示例代码 #include <iostream>using namespace std;void swap(int *x,int *y)//指针传参 {int tmp;t…

静态页面上传服务器无法显示css效果

今天做比赛的项目&#xff0c;把静态页面上传到服务器&#xff0c;发现外联的css文件的效果无法显示&#xff0c;一开始以为是路径问题&#xff0c;后面改了发现没有改变。 然后发现在浏览器上css文件中content-type: text/plain的问题 这才是正确的&#xff1a; 修改办法&…

水牛社:互联网赚钱秘籍,免费项目,你真敢要吗?

免费是最贵的。真正理解并使用这句话的只有少数人&#xff0c;今天在网上分享一下免费项目背后的逻辑&#xff0c;抛开现象&#xff0c; 本质是最重要的。 我从事互联网工作15年。不管是过去还是现在&#xff0c;总有人喜欢问有没有免费项目&#xff1f; 其实我平时懒得回答…

【智能算法】省时方便,智能算法统计指标——一键运行~

目录 1.常用统计指标2.参数统计检验3.结果展示4.自定义修改测试框架 1.常用统计指标 测试智能算法性能时&#xff0c;常常会用到以下5种常用指标&#xff0c;简单不赘述&#xff1a; 最优值、最差值、均值、中位数、标准差 2.参数统计检验 单纯依靠常用统计指标说服力不足&…

每天五分钟深度学习PyTorch:面对Tensorflow,为何我选择PyTorch

这篇专栏文章不是为了挑起tenserflow和pytorch中哪个更好&#xff0c;众所周知tensorflow诞生以来&#xff0c;已经成为最流行的深度学习框架&#xff0c;可以说github中大多数的深度学习代码实现是以tensorflow实现的&#xff0c;也就是说资源众多&#xff0c;社区强大&#x…

Platforms Jumping(贪心,处理策略)

文章目录 题目描述输入格式输出格式样例输入1样例输出1样例输入2样例输出2样例输入3样例输出3提交链接提示 解析参考代码 题目描述 有一条宽度为 n n n 的河流。河的左岸是 0 0 0 单元格&#xff0c;右岸是 n 1 n1 n1 单元格(更正式地说&#xff0c;这条河可以表示为一串从…

APP被DDoS攻击时,企业应该如何防护?

某平台遭到分布式拒绝服务攻击&#xff0c;大规模、持续性的攻击&#xff0c;导致平台的APP、网站的部分用户出现间歇性无法登录、加载失败或缓慢等情况。据了解&#xff0c;平台在一个月的时间内陆续遭受到近30次的网络攻击。在这段时间内&#xff0c;平台不断地接收到短时间、…

在Debian 12系统上安装Docker

Docker 在 Debian 12 上的安装 安装验证测试更多信息引言 在现代的开发环境中,容器技术发挥着至关重要的作用。Docker 提供了快速、可靠和易于使用的容器化解决方案,使开发人员和 DevOps 专业人士能够以轻松的方式将应用程序从一个环境部署到另一个环境。 Docker 的安装过程在…

稀碎从零算法笔记Day45-LeetCode:电话号码的字母组合

题型&#xff1a;映射、回溯算法、递归 链接&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出…

python如何输入多行

Python中的Input()函数在输入时&#xff0c;遇到回车符&#xff0c;那么一次输入就结束了。这不能满足输入多行文本并且行数也不确定的情形&#xff0c;当然输入空行也是允许的。 方法1&#xff1a;利用异常处理机制实现 lines[] while True:try:lines.append(input())except:…

【Java基础题型】矩阵的对角线求和

一、题目-矩阵 求一个33矩阵对角线元素之和。 输入格式 矩阵 输出格式 主对角线 副对角线 元素和 样例输入 1 2 3 1 1 1 3 2 1 样例输出 3 7 二、参考的知识 这里给大家送点英语单词&#xff0c;记得学习&#xff1a; p r i m a r y. adj.主要的&#xff1b;初…

2024.4.8Morris中序遍历(线索二叉树)学习

这次博主在学习完知识点和代码之后&#xff0c;准备对这个知识重新进行整理总结。站在一个初学者的角度来看待这个知识点&#xff0c;在他人的讲解基础上加一点点自己的理解&#xff0c;并记录下来。以加深自己的理解&#xff0c;并且希望能够帮助到你。博主是一个初学者&#…

vue的监视属性

目录 1. 场景引入2. watch3. 深度监视4. 监视属性简写5. 小结 1. 场景引入 在实际开发中&#xff0c;有时开发者需要根据某个属性的变化&#xff0c;做出相应的决策&#xff0c;因此Vue为开发者提供了watch.这一监视属性&#xff0c;用于实现此类需求。比如下面这个场景&…

【muzzik 分享】原生预览调试!我给Cocos加了个新功能,原生开发者福音

前言 一年一度的征稿到了&#xff0c;倒腾点存货&#xff0c;在之前阅读云风大佬文章的时候&#xff0c;发现他的引擎调试机制是在 手机上实时刷新预览&#xff0c;而不是在PC上调试&#xff0c;作为一个 Cocos 原生开发者&#xff0c;我深有体会&#xff0c;主要有以下原因 C…