React(react18)中组件通信06——redux-toolkit + react-redux

news2024/10/7 11:32:02

React(react18)中组件通信06——redux-toolkit + react-redux

    • 1 前言
    • 1.1 redux 和 react-redux
    • 1.2 关于redux-toolkit
      • 1.2.1 官网
      • 1.2.2 为什么要用Redux Toolkit?
    • 1.3 安装 Redux Toolkit
    • 1.4 Redux Toolkit相关API
  • 2. 开始例子——官网例子
    • 2.1 创建 Redux Store
    • 2.2 为 React 提供 Redux Store
    • 2.3 创建 Redux State Slice
      • 2.3.1 counterSlice.js文件
      • 2.3.2 对比之前的action 和 reducer
    • 2.4 添加 Slice Reducers 到 Store
    • 2.5 在 React 组件中使用 Redux State 和 Actions
    • 2.6 渲染
    • 2.7 效果
      • 2.7.1 效果展示
      • 2.7.2 说明
    • 2.8 注意:
    • 2.9 附代码
  • 3. 例子2——练手小例子
    • 3.1 再添加一个Dog组件
    • 3.1.1 编写 dogSlice
      • 3.1.2 修改store.js
      • 3.1.3 编写dog组件
      • 3.1.4 效果
    • 3.2 这数据共享也太简单了吧
      • 3.2.1 试试数据共享
      • 3.2.2 react-redux + redux 数据共享
  • 4. 关于 Payload——载荷payload
  • 5. 项目代码
    • 5.1 代码目录
    • 5.2 下载项目

1 前言

1.1 redux 和 react-redux

  • 前面两篇文章已经介绍过了,需要的可以点进去看看:
    React(react18)中组件通信04——redux入门.
    React(react18)中组件通信05——redux ➕ react-redux(含数据共享).

1.2 关于redux-toolkit

1.2.1 官网

  • https://redux-toolkit.js.org/.
  • https://cn.react-redux.js.org/tutorials/quick-start.

1.2.2 为什么要用Redux Toolkit?

  • 首先看官网怎么说?
    在这里插入图片描述
  • 然后看我们代码中createStore已经被弃用了,如下:
    在这里插入图片描述
    在这里插入图片描述

1.3 安装 Redux Toolkit

  • 安装命令如下
    npm install @reduxjs/toolkit
    
    yarn add @reduxjs/toolkit
    
  • 如果项目没有装过react-redux,可以两个一起安装,但是不用单独安装 redux 了,react-redux + redux-toolkit 替换了 react-redux + redux
    npm install @reduxjs/toolkit react-redux
    
    yarn add @reduxjs/toolkit react-redux
    

1.4 Redux Toolkit相关API

  • 先简单介绍几个

  • 官网全,还是看官网吧
    在这里插入图片描述

2. 开始例子——官网例子

  • 过程参考官方下面的地址:
    https://cn.react-redux.js.org/tutorials/quick-start/.

2.1 创建 Redux Store

  • 从 Redux Toolkit 中导入 configureStore API。我们将开始创建一个空的 Redux store,并导出它,如下:
    import { configureStore } from '@reduxjs/toolkit';
    
    export default configureStore({
      reducer: {
         
      },
    });
    
  • 这将创建一个 Redux store,并自动配置 Redux DevTools 扩展,以便你可以在开发时检查 store。

2.2 为 React 提供 Redux Store

  • 这个按照原先的保持不变就行,如下:
    在这里插入图片描述

2.3 创建 Redux State Slice

2.3.1 counterSlice.js文件

  • 创建 slice 需要一个字符串名称来标识 slice,一个初始 state 值,以及一个或多个 reducer 函数来定义如何更新 state。创建 slice 后,我们可以导出生成的 Redux action creators 和整个 slice reducer 函数
  • 如下:
    在这里插入图片描述

2.3.2 对比之前的action 和 reducer

  • 之前的action写法,如下:
    function incrementOne(){
        type:'INCREMENT_ONE'
    }
    function incrementNumber(number){
        type:'INCREMENT_NUMBER',
        number:number
    }
    export default{incrementOne,incrementNumber}
    
  • 之前的reducer写法,如下
     function countReducer(state = 0,action){
         switch (action.type) {
             case 'INCREMENT_ONE':
                 return state + 1;
             case 'INCREMENT_NUMBER':
                 return state + action.number;
             default:
                 return state;
         }
     }
     export default{countReducer}
    

2.4 添加 Slice Reducers 到 Store

  • 接下来,我们需要从 counter slice 中导入 reducer 函数并将其添加到我们的 store 中。通过在 reducers 参数中定义一个字段,我们告诉 store 使用这个 slice reducer 函数来处理该 state 的所有更新。
  • 所以最后的store.js,如下:
    在这里插入图片描述

2.5 在 React 组件中使用 Redux State 和 Actions

  • 现在我们可以使用 React Redux hooks 让 React 组件与 Redux store 交互。我们可以使用 useSelector从 store 中读取数据(不通过props了),并使用 useDispatch dispatch actions。
  • 组件内设计如下:
    在这里插入图片描述
    在这里插入图片描述

2.6 渲染

  • 一样的代码
    在这里插入图片描述

2.7 效果

2.7.1 效果展示

  • 如下:
    在这里插入图片描述

2.7.2 说明

  • 单击 【点我+1】 、 【点我-1】和【加数】按钮:
    对应的 Redux action 会被 dispatch 到 store;
    计数 slice reducer 将看到 actions 更新其 state;
    <Counter> 组件将从 store 中看到新的 state 值,并使用新的数据重新渲染自己。

2.8 注意:

  • 如下:
    在这里插入图片描述

2.9 附代码

  • counterSlice.js

    
    import {createSlice} from '@reduxjs/toolkit'
    
    export const counterSlice = createSlice({
        name: 'myFirstCounterSlice',  //这个名字随便取  标识
        initialState: {
            value: 0,  //初始值
        },
        reducers: {  // 对比之前的reducer是一个函数,里面是根据不同的action的type判断的switch语句
            incrementOne: (state) =>{  //下面生成 加 1 的action,等价于原先只有type的action
                state.value += 1;
            },
            decrementOne: (state) =>{  //下面生成 减 1 的action,等价于原先只有type的action
                state.value -= 1;
            },incrementNumber: (state,action) =>{  //等价于不只有type一个参数的action
                state.value += action.payload;  //payload
            }
        }
    });
    
    // 为每个 case reducer 函数生成 Action creators
    export const {incrementOne,decrementOne,incrementNumber} = counterSlice.actions;
    
    const countReducer = counterSlice.reducer;
    export default countReducer;
    
  • store.js

    import { configureStore } from '@reduxjs/toolkit';
    import countReducer from './reducerAndAction/counterSlice';
    
    export default configureStore({
      reducer: {
         counterState: countReducer,
      },
    });
    
  • Counter.jsx

    import {useRef} from "react";
    import { useDispatch, useSelector } from 'react-redux'
    import {incrementOne,decrementOne,incrementNumber} from '../redux/reducerAndAction/counterSlice'
    
    
    function Couter(){
        // console.log(props);
        const numberRef = useRef();
    
        const count = useSelector((state)=>state.counterState.value);
        const dispatch = useDispatch();
    
        //加 1 的
        function addOne(){
            dispatch(incrementOne());
        }
    
        //动态增加
        function addNumber(){
            const stringNumber = numberRef.current.value; //直接取取的是字符串
            const number = parseInt(stringNumber);
            const addNumberAction = incrementNumber(number);   //有参数的action
            dispatch(addNumberAction);
        }
    
        return(
            <div>
                当前数值是:{count}  <br />
                <button onClick={addOne}>点我+1</button>  &nbsp;&nbsp;
    
                <button onClick={()=>dispatch(decrementOne())}>点我-1</button>
    
                <br /><br />
                <input type="number" ref={numberRef} placeholder="请输入要加的数"/>  &nbsp;&nbsp;
                <button onClick={addNumber}>加数</button>
            </div>
        )
    }
    
    export default Couter;
    

3. 例子2——练手小例子

3.1 再添加一个Dog组件

3.1.1 编写 dogSlice

  • 如下:
    在这里插入图片描述

3.1.2 修改store.js

  • 如下:
    在这里插入图片描述

3.1.3 编写dog组件

  • 为了方便,添加就简单写了,需要的自行优化,如下:
    在这里插入图片描述

3.1.4 效果

  • 如下:
    在这里插入图片描述

3.2 这数据共享也太简单了吧

3.2.1 试试数据共享

  • 直接访问试试,代码如下:
    在这里插入图片描述
  • 还真行,这可比redux + react-redux 简单太多了,效果如下
    在这里插入图片描述

3.2.2 react-redux + redux 数据共享

  • 关于react-redux + redux 数据共享怎么实现的数据共享,需要的看下面的文章,如下:
    React(react18)中组件通信05——redux ➕ react-redux(含数据共享).

4. 关于 Payload——载荷payload

  • 关于state.value += action.payload; //payload ,下面举个例子,如果还用原先的redux的话,action也可以如下写法:
    在这里插入图片描述
  • 再比如, “新增一个待办事项” 的 Action创造函数,你可以这么写:
    var id = 1
    function addTodo(content) {
      return {
        type: 'ADD_TODO',
        payload: {
          id: id++,
          content: content, // 待办事项内容
          completed: false  // 是否完成的标识
        }
      }
    }
    
  • 这就可以理解 action.payload 为啥要这么用,为了规范呗,不管你传的是什么参数,数字还是对象,都是action.payload,看一下我们上面的例子就更好理解了,如下:
    在这里插入图片描述

5. 项目代码

5.1 代码目录

  • 如下:
    在这里插入图片描述

5.2 下载项目

  • 如下:
    https://download.csdn.net/download/suixinfeixiangfei/88371794.

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

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

相关文章

【Windows】 Windows 10 等系统如何关闭文件夹预览模式

在Windows系统进行文件操作时&#xff0c;由于屏幕尺寸有限&#xff0c;有时感觉文件夹右侧的预览模式很占位置&#xff0c;因此想预览时打开&#xff0c;想关闭时就关闭。 以下是两种解决方案&#xff1a; 方案一&#xff1a;彻底关闭预览模式 方案二&#xff1a;可通过快捷键…

Leetcode 1379.找出克隆二叉树中的相同节点

给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0c;以及一个位于原始树 original 中的目标节点 target。 其中&#xff0c;克隆树 cloned 是原始树 original 的一个 副本 。 请找出在树 cloned 中&#xff0c;与 target 相同 的节点&#xff0c;并返回对…

JDK 21 — JDK 21发布及多项新特性!

一、JDK 21 新特性说明 JDK 21 已经于 2023 年 9 月 19 日正式发布&#xff0c;Java 21 / JDK 21 已正式 GA&#xff0c;此版本是继 JDK 17 后的长期支持版本 (LTS)&#xff0c;Oracle 将为其提供至少八年的技术支持和更新。本文总结了 JDK 21 发布的新特性。 二、JDK 21 正式…

基于PyTorch3D的GeoAI实现【ESRI】

Esri 的 AI 原型团队正在以 PyTorch3D API 的一系列 PR 的形式分享一些功能增强功能。 这些功能支持 obj 格式的网格的输入/输出 (I/O)&#xff0c;该网格具有多个纹理和代表真实世界几何形状的顶点坐标。 对于 GeoAI 任务&#xff0c;这些功能支持跨网格分割管道的任务&#x…

第36节——useDebugValue+React Developer Tools——了解

一、概念 勾住”React开发调试工具中的自定义hook标签&#xff0c;让useDebugValue勾住的自定义hook可以显示额外的信息。useDebugValue的目的是“在react开发者工具自定义hook标签中显示额外信息”&#xff0c;方便我们“一眼就能找到”对应的自定义hook。useDebugValue(valu…

信息安全:网络物理隔离技术原理与应用.

信息安全&#xff1a;网络物理隔离技术原理与应用. 随着网络攻击技术不断增强&#xff0c;恶意入侵内部网络的风险性也相应急剧提高。满足内外网信息及数据交换需求&#xff0c;又能防止网络安全事件出现的安全技术就应运而生了&#xff0c;这种技术称为“物理隔离技术” 基本原…

如何用Postman做接口自动化测试

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完…

应用开发平台集成工作流系列之12——流程导航功能设计与实现

背景 流程模板主要是用于流程建模的&#xff0c;对于业务用户而言&#xff0c;需要一个业务流程的导航页&#xff0c;分门别类展示业务流程清单&#xff0c;用于发起新的流程。 并且需要根据当前用户过滤&#xff0c;只显示有权限发起的流程。 业务流程类别的处理 一个企业的…

OCR -- 文本检测

目标检测&#xff1a; 不仅要解决定位问题&#xff0c;还要解决目标分类问题&#xff0c;给定图像或者视频&#xff0c;找出目标的位置&#xff08;box&#xff09;&#xff0c;并给出目标的类别&#xff1b; 文本检测&#xff1a; 给定输入图像或者视频&#xff0c;找出文本的…

基于 SpringBoot+Vue 的口腔管理平台,附源码,数据库

第一章 简介 本项目&#xff0c;是基于 Java SpringBoot 开发的&#xff0c;主要功能包括首页、个人中心、病例就诊信息管理、复查提醒管理、预约挂号管理、我的收藏管理、订单管理&#xff0c;前台首页&#xff1b;首页、牙齿保健产品、牙齿保护小知识、留言反馈、个人中心、…

React(react18)中组件通信05——redux ➕ react-redux(含数据共享)

React&#xff08;react18&#xff09;中组件通信05——redux ➕ react-redux&#xff08;含数据共享&#xff09; 1. 前言1.1 React中组件通信的其他方式1.2 介绍React-Redux1.2.1 简单介绍React-Redux1.2.2 官网 1.3 安装react-redux 2. 简单改写redux的例子2.1 提供store2.2…

【从0学习Solidity】37. 数字签名 Signature

【从0学习Solidity】37. 数字签名 Signature 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0…

提示计算机丢失msvcp140.dll怎么办,缺少msvcp140.dll一键修复

在计算机使用过程中&#xff0c;我们可能会遇到各种稀奇古怪的问题。其中&#xff0c;msvcp140.dll 文件丢失算是比较常见的一种。那么&#xff0c;究竟什么是 msvcp140.dll 文件&#xff1f;它为什么会丢失&#xff1f;我们又该如何解决这个问题呢&#xff1f;本文将围绕这些问…

向量数据库库Milvus Cloud2.3 技术选型中性能、成本、扩展性是重点

技术选型中性能、成本、扩展性是重点 对于向量数据库来说,用户最关心的莫过于性能、成本和扩展性。 Milvus 2.x 从 Day 1 开始就将扩展性作为设计的第一优先级,在众多用户环境中落地了十亿至百亿级别场景。不止如此,对于 Milvus 来说,扩展性不仅仅意味着支持百亿级别向量,…

vue指令(代码部分)

注&#xff1a;此部分为学习uni-app时接触到的vue <template><view><view>当前标题&#xff1a;{{title}}</view><view> {{num}}</view><view>{{arr[2]}}</view><view>{{obj}}</view><view>{{obj.name}}&l…

导览软件定制开发方案

随着智能手机的普及和人们对文化、旅游等方面的需求不断增加&#xff0c;导览软件市场前景广阔。本文将围绕导览软件定制开发方案展开&#xff0c;包括以下部分&#xff1a; 一、行业现状及市场需求 导览软件市场发展迅速&#xff0c;各类导览软件层出不穷。通过对市场…

价值1000的情感爆文写作prompt,助你写出10万+阅读微信爆文

原文&#xff1a;价值1000的情感爆文写作prompt&#xff0c;助你写出10万阅读微信爆文 - 知乎 是否经常看到一些自媒体晒出这样的图片&#xff1f; 或者是这样的10w的阅读文章 那么这是真实能赚钱的吗&#xff1f;还是自媒体夸大其说&#xff0c;吸引流量。 我们先简单了解什…

ElementUI之登陆+注册->饿了吗完成用户登录界面搭建,axios之get请求,axios之post请求,跨域,注册界面

饿了吗完成用户注册登录界面搭建axios之get请求axios之post请求跨域 1.饿了吗完成用户注册登录界面搭建 将端口号8080改为8081 导入依赖&#xff0c;在项目根目录使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 -g&#xff1a;将依赖下载node_glodal全局依…

网络上怎么赚点零花钱

现代物质社会中&#xff0c;我们常常会被琐碎的开销困扰。无论是衣食住行还是休闲娱乐&#xff0c;总有一些额外的花费&#xff0c;使我们不得不时常思索如何赚点零花钱。而现如今&#xff0c;随着互联网的飞速发展&#xff0c;我们有了更多的机会通过网络来实现这个目标。现在…

Centos7做回收站功能-防止误删除

Centos7做回收站功能&#xff0c;就算误删了文件&#xff0c;也可以还原回来 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.先创建一个回收站的目录&#xff08;我在/data下&#xff09; 在大磁盘的目录下创建.trash文件夹 mkdir -p /data/.trash 2.在/root/.bas…