React(react18)中组件通信05——react-redux

news2024/11/24 14:54:21

React(react18)中组件通信05——react-redux

  • 1. 前言
    • 1.1 React中组件通信的其他方式
    • 1.2 介绍React-Redux
      • 1.2.1 简单介绍React-Redux
      • 1.2.2 官网
    • 1.3 安装react-redux
  • 2. 简单改写redux的例子
    • 2.1 提供store
    • 2.2 连接 Components + UI组件修改
      • 2.2.1 连接 Components
      • 2.2.2 修改UI组件
      • 2.2.3 看效果
    • 2.3 连接 Components——优化(优化容器组件)
    • 2.4 优化容器组件(可怕的精简)
    • 2.5 附代码
  • 3. 附项目

1. 前言

1.1 React中组件通信的其他方式

  • React(react18)中组件通信01——props.
  • React(react18)中组件通信02——消息订阅与发布、取消订阅以及卸载组件时取消订阅.
  • React(react18)中组件通信03——简单使用 Context 深层传递参数.
  • React(react18)中组件通信04——redux入门.

1.2 介绍React-Redux

1.2.1 简单介绍React-Redux

  • React-Redux是Redux 官方提供的 React 绑定库。 具有高效且灵活的特性。
    • react-redux 是一个专为 React 应用开发而设计的基于 Redux 的库,提供了一些特定于 React 的功能和组件。
    • 它提供了一系列的 API 和组件,方便在 React 组件中使用 Redux 进行状态管理。
  • React-Redux 在概念上非常简单。它订阅 Redux 存储,检查组件所需的数据是否已更改,并重新渲染组件
  • react-redux 提供了一些特定于 React 的功能,如 connect 函数和 Provider 组件,用于连接 Redux 的 store,并将状态传递给 React 组件。
    • React Redux 提供的 <Provider /> 组件,这使得 Redux store 能够在应用的其他地方使用(即:store只需在入口文件传递一次,其他需要store的容器组件中都可以获取)。

1.2.2 官网

  • 参考官网:
    • 官网地址:https://react-redux.js.org/.
    • gitHub上:https://github.com/reduxjs/react-redux.
    • Redux 中文官网.
    • React Redux 中文文档.
  • 了解react-redux的其他博客:
    • React-Redux 的历史和实现.
  • 关于下面用到的connect API,去官网去官网:
    https://cn.react-redux.js.org/tutorials/connect.

1.3 安装react-redux

  • 安装命令如下:
    # If you use npm:
    npm install react-redux
    
    # Or if you use Yarn:
    yarn add react-redux
    

2. 简单改写redux的例子

  • 注意,这个改写是在redux项目版本的基础上改写的,关于redux版本的,看下面的:
    React(react18)中组件通信04——redux入门.

2.1 提供store

  • 第一步我们需要使得 store 对于我们的应用是可见的。为了做到这个,我们使用 React Redux 提供的 API <Provider /> 去包裹我们的应用。:
    • 首先先给改写后的目录结构
      在这里插入图片描述
    • 然后再看app.js 和 index.js
      在这里插入图片描述

2.2 连接 Components + UI组件修改

2.2.1 连接 Components

  • 先看官网怎么讲解的
    在这里插入图片描述

  • 先简单写写实现效果,后续再优化,如下:
    在这里插入图片描述

    import CountNumRedux from "../components/CountNumRedux";
    import { connect } from "react-redux";
    import store from '../redux/store'
    
    //这里ownProps如果用不到的话,可以不传,可以只传state
    const mapStateToProps = (state, ownProps) => ({
          // ...依据 state 和 自定义 ownProps 生成 computed data
          /**
           * 即状态统一在容器组件中管理
           * UI组件使用的话直接通过props取就行了,这种方式也相当于通过props传递
           * 如果监听state的变化,一有变化就调用,并把state通过props传递给UI组件
           */
          count:state
        //   name:'麦兜'
      });
    
      const mapDispatchToProps = ()=>({
        // ... 通常是一个充满 action creators 的 object
           addNumber:(number)=>{
               store.dispatch(
                   { type: 'INCREMENT', number:number }
               )
           },
           reduceNumber:(number)=>{
               store.dispatch(
                   { type: 'DECREMENT', number:number }
               )
           }
     });
    
      
    //   // 1. `connect` 返回一个接收要包装的组件的新函数:
    //   const connectToStore = connect(mapStateToProps, mapDispatchToProps);
    
    //   // 2. 并且该函数返回连接的,包装的组件:
    //   const ConnectedComponent = connectToStore(Component);
      
      // 通常我们会将两者一步完成,像这样:
    const CountNumContainer = connect(mapStateToProps, mapDispatchToProps)(CountNumRedux);
    
    export default CountNumContainer;
    

2.2.2 修改UI组件

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

    import {  createRef } from "react";
    // import store from '../redux/store'
    // import countAction from '../redux/countAction'
    
    function CountNumRedux(props){
        console.log(props);
    
        // const [count,setCount] = useState(0);
        const numberRef = createRef();
    
        function add(){
            let number = numberRef.current.value;
            // console.log(typeof number);  //string
            // store.dispatch(countAction.incrementNum(parseInt(number)));
            props.addNumber(parseInt(number));
        }
    
        function subtract(){
            let number = parseInt(numberRef.current.value);
            props.reduceNumber(number);
        }
    
        // useEffect(()=>{
        //     store.subscribe(()=>{
        //         console.log('订阅更新,打印2-----',store.getState());
        //         setCount(store.getState());
        //     });
        // });
    
        return(
            <div>
                {/* 当前数字是:{count}    &nbsp;&nbsp;&nbsp;&nbsp;
                当前数字是:{store.getState()}   */}
    
                当前数值是:{props.count}
                <br />
                浮动数字:<input type="number" ref={numberRef}/>
    
                <br /><br />
                <button onClick={add}>点我 加数</button> <br /><br />
                <button onClick={subtract}>点我 减数</button>
            </div>
        )
    }
    export default CountNumRedux;
    

2.2.3 看效果

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

2.3 连接 Components——优化(优化容器组件)

  • 主要优化 mapDispatchToProps,用封装好的action,如下:

    import CountNumRedux from "../components/CountNumRedux";
    import { connect } from "react-redux";
    // import store from '../redux/store'
    import {incrementNum,decrementNum} from "../redux/countAction";
    
    
    const mapStateToProps = (state) => ({
          count:state
      });
    
    
    //   const mapDispatchToProps = ()=>({
    //        addNumber:(number)=>{
    //            store.dispatch(
    //                { type: 'INCREMENT', number:number }
    //            )
    //        },
    //        reduceNumber:(number)=>{
    //            store.dispatch(
    //                { type: 'DECREMENT', number:number }
    //            )
    //        }
    //  });
    
    /**
     * 1. dispatch:react-redux 会将dispatch传入,所以不用引入store来调了
     * 2. 引入已经封装好的action:countAction
     */
     const mapDispatchToProps = (dispatch)=>({
        addNumber:(number)=>{
            dispatch( incrementNum(number) )
        },
        reduceNumber:(number)=>{
            dispatch( decrementNum(number) )
        }
    });
    
    const CountNumContainer = connect(mapStateToProps, mapDispatchToProps)(CountNumRedux);
    
    export default CountNumContainer;
    

2.4 优化容器组件(可怕的精简)

  • mapDispatchToProps: 此参数可以是一个 function,或者一个 object。
    • 上面都是用function写的,接下来换成object之后,代码真的太少了!
    • 不妨再看一下官方强调的:
      在这里插入图片描述
  • 精简代码如下:
    /**
     * 优化2
     */
    const mapDispatchToProps = {
        //通常是一个充满 action creators 的 object
        addNumber: incrementNum,   //addNumber:是通过props传递给UI组件的方法, incrementNum:是封装好的action函数
        reduceNumber: decrementNum
    }
    
    对比一下:
    在这里插入图片描述

2.5 附代码

  • 关于redux文件下的代码就不贴了,因为没改动,需要的直接上篇文章就行,其他如下:
    • CountNumContainer.jsx
      import CountNumRedux from "../components/CountNumRedux";
      import { connect } from "react-redux";
      import {incrementNum,decrementNum} from "../redux/countAction";
      
      const mapStateToProps = (state) => ({
            count:state
        });
      
      const mapDispatchToProps = {
          //通常是一个充满 action creators 的 object
          addNumber: incrementNum,   //addNumber:是通过props传递给UI组件的方法, incrementNum:是封装好的action函数
          reduceNumber: decrementNum
      }
      
      const CountNumContainer = connect(mapStateToProps, mapDispatchToProps)(CountNumRedux);
      
      export default CountNumContainer;
      
    • CountNumRedux.jsx
      import {  createRef } from "react";
      
      function CountNumRedux(props){
          console.log(props);
          
          const numberRef = createRef();
      
          function add(){
              let number = numberRef.current.value;
              props.addNumber(parseInt(number));
          }
      
          function subtract(){
              let number = parseInt(numberRef.current.value);
              props.reduceNumber(number);
          }
      
          return(
              <div>
                  {/* 当前数字是:{count}    &nbsp;&nbsp;&nbsp;&nbsp;
                  当前数字是:{store.getState()}   */}
      
                  当前数值是:{props.count}
                  <br />
                  浮动数字:<input type="number" ref={numberRef}/>
      
                  <br /><br />
                  <button onClick={add}>点我 加数</button> <br /><br />
                  <button onClick={subtract}>点我 减数</button>
              </div>
          )
      }
      export default CountNumRedux;
      
    • App.js
      import CountNumContainer from './container/CountNumContainer.jsx'
      
      function App() {
        return (
          <div>
            {/* <CountNumRedux/> */}
            <CountNumContainer/>
          </div>
        );
      }
      
      export default App;
      
    • index.js
      import React from 'react';
      import ReactDOM from 'react-dom/client';
      import App from './App';
      
      import store from './redux/store';
      import { Provider } from 'react-redux';
      
      
      const root = ReactDOM.createRoot(document.getElementById('root'));
      root.render(
          <Provider store={store}>
              <App />
          </Provider>
      );
      
      export default root;
      

3. 附项目

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

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

相关文章

Dubbo 3.x源码(11)—Dubbo服务的发布与引用的入口

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的入口的源码。 此前我们学习了Dubbo配置的加载与覆盖的一系列源码&#xff1a; Dubbo 3.x源码(7)—Dubbo配置的加载入口源码Dubbo 3.x源码(8)—Dubbo配置中心的加载与优先级源码Dubbo 3.x源码(9)—Dubbo启动元数据中…

通过 Helm Chart 部署 Easysearch

Easysearch 可以通过 Helm 快速部署了&#xff0c;快来看看吧&#xff01; Easysearch 的 Chart 仓库地址在这里 https://helm.infinilabs.com。 使用 Helm 部署 Easysearch 有两个前提条件&#xff1a; cert-managerlocal-path 我们先按照 Chart 仓库的说明来快速部署一下…

OpenCV之九宫格图像

将一张图像均等分成九份&#xff0c;然后将这九个小块按一定间隔&#xff08;九宫格效果&#xff09;拷贝到新画布上。效果如下图所示&#xff1a; 源码&#xff1a; #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv;i…

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1&#xff09;定义模型结构2&#xff09;优化损失函数 3. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存 相关其它博客工程源代码下载其它资料下载 前言 本项目采用了矩阵分…

优维低代码实践:图片和搜索

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

Unity中Shader模板测试使用到的二进制

文章目录 前言&#xff08;接上一篇文章&#xff09;一、模板测试公式1、简化版(在ReadMask默认值的情况下)2、完整版 二、二进制的值1、0 和 1组成2、符号3、二进制的与运算4、二进制和十进制转化 三、在Shader中的实际操作 前言&#xff08;接上一篇文章&#xff09; Unity中…

JimuReport积木报表 v1.6.2 版本正式发布—开源免费的低代码报表

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

(Tekla Structures二次开发)获取当前模型文件夹路径

代码如下&#xff1a; TSM.Model model new TSM.Model();if(model.GetConnectionStatus()){ModelInfo modelInfo model.GetInfo();MessageBox.Show(modelInfo.ModelPath); // model.CommitChanges();}运行结果如下&#xff1a;

项目文章 | Plant Commun(IF:10.5)发表附属染色体调节植物-真菌互作从寄生到共生转换的分子作用机制

发表单位&#xff1a;中国林业科学院林木遗传育种国家重点实验室/中国林业科学研究院亚热带林业研究所 发表时间&#xff1a;2023年8月9日 期刊&#xff1a;Plant Communications&#xff08;IF&#xff1a;10.5&#xff09; 2023年8月9日&#xff0c;中国林业科学院林木遗传…

Postman应用——接口请求和响应(Get和Post请求)

文章目录 新增Request请求Get请求Post请求 Request请求响应Postman响应界面说明请求响应另存为示例&#xff08;模板&#xff09;Postman显示的响应数据清空请求响应数据保存到本地文件 这里只讲用的比较多的Get和Post请求方式&#xff0c;也可以遵循restful api接口规范&#…

Centos7部署gitlab

建议服务器配置不低于2C8G 1、安装必要的依赖 sudo yum install -y curl policycoreutils-python openssh-server perl2、配置极狐GitLab 软件源镜像 curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash sudo yum install gitlab-jh -y3、…

Windows下SSH配置多账号

C:\Users\Administrator\.ssh 目录下新建config文件 config文件内容如下 配置了两个账号&#xff0c;举例如下 # github Host github.com HostName github.com IdentityFile ~/.ssh/github_id_rsa PreferredAuthentications publickey# gitee Host gitee.com HostName gitee.…

OR63 删除公共字符

目录 一、题目 二、代码 三、易错 一、题目 删除公共字符_牛客题霸_牛客网 二、代码 #include <iostream> #include <string> using namespace std;int main() {string s1,s2;getline(cin,s1);getline(cin,s2);string s3;int mark 0;//若s1中的字符在s2中不存…

线性调频雷达回波仿真+脉冲压缩仿真

雷达发射的线性调频信号&#xff1a; s ( t ) r e c t ( t τ ) e x p j 2 π f 0 t j π μ t 2 s(t)rect(\frac{t}{\tau})exp{j2\pi f_0tj\pi \mu t^2} s(t)rect(τt​)expj2πf0​tjπμt2 不考虑RCS&#xff0c;假设目标回波的幅度不变&#xff0c;那么目标反射回波可以…

Cpp/Qt-day050921Qt

目录 实现使用数据库的登录注册功能 头文件&#xff1a; registrwidget.h: widget.h: 源文件&#xff1a; registrwidget.c: widget.h: 效果图&#xff1a; 思维导图 实现使用数据库的登录注册功能 头文件&#xff1a; registrwidget.h: #ifndef REGISTRWIDGET_H #de…

爬虫 — 字体反爬

目录 一、安装字体软件 FontCreator二、百度智能云文字识别三、案例一四、案例二五、案例三六、安装 Tesseract1、安装步骤2、配置环境3、使用 Python 识别图片信息 七、案例四 一、安装字体软件 FontCreator 点击下载字体软件 FontCreator 安装包 1、同意协议&#xff0c;点击…

QT--day5

注册 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QPushButton> #include<QLineEdit> #include<QLabel> #include <QMessageBox> #include<QString> #include<QSqlDatabase> …

python教程:使用gevent实现高并发并限制最大并发数

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 import time import gevent from gevent.pool import Pool from gevent import monkey # 一&#xff0c;定义最大并发数 p Pool(20) # 二&#xff0c;导入gevent…

Python —— excel文件操作(超详细)

背景 很多公司还是用excel去管理测试用例的&#xff0c;所以为了减少重复繁琐的导出导出工作&#xff0c;学会如何用代码操作excel表格很实用~ 1、读取excel文件基本步骤 1、操作excel的一些库 1、xlrd&#xff1a;读取库&#xff0c;xlwt&#xff1a;写入&#xff0c;现在…

win10 Baichuan2-7B-Chat-4bits 上部署 百川2-7B-对话模型-4bits量化版

搞了两天才搞清楚跑通 好难呢,个人电脑 win10 ,6GB显存 个人感觉 生成速度很慢,数学能力不怎么行 没有ChatGLM2-6B 强,逻辑还行, 要求: 我的部署流程 1.下载模型 ,下载所有文件 然后 放到新建的model目录 https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat-4bits/tr…