react-redux库

2023-10-26

在这里插入图片描述

安装react-redux

tnpm i react-redux

在这里插入图片描述

在这里插入图片描述

未优化前:

—— src/components/Count/index.tsx

import React, { useState } from 'react'
export default function CountUI(props:any) {
    console.log('UI组件接收到的props是', props)
    const [value, setValue] = useState<number>(0)

    const increment = () => {
        props.incre(value * 1)
    }
    const decrement = () => {
        props.decre(value * 1)
    }
    const incrementIfOdd = () => {
        if (props.count % 2 !== 0)
        props.incre(value * 1)
    }
    const incrementAsync = () => {
        props.increAsync(value * 1, 1000)
    }

    const select = (e: any) => {
        const index = e.target.selectedIndex // 选中项的index
        setValue(e.target.options[index].value) // 选中项的value值
    }
    return (
        <div>
            <h1>当前求和为: {props.count}</h1>
            <select onChange={select}>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>&nbsp;
            <button onClick={increment}>+</button>&nbsp;
            <button onClick={decrement}>-</button>&nbsp;
            <button onClick={incrementIfOdd}>当前求和为奇数再加</button>&nbsp;
            <button onClick={incrementAsync}>异步加</button>&nbsp;
        </div>
    )
}

—— src/containers/Count/index.tsx

// 引入Count的UI组件
import CountUI from '../../components/Count'
import  { 
    createIncrementAction,
    createDecrementAction,
    createIncrementAsyncAction
} from '../../redux/count_action'
// 引入connect用于连接UI组件与redux
import { connect } from 'react-redux' 


// mapStateoProps函数返回的对象中的key作为传递给UI组件props的key
// value作为传递给UI组件props的value 
// —— mapStateoProps用于传递状态
function mapStateoProps(state: any) {
    return {count: state}
}
// mapDispatchToProps函数返回的对象中的key作为传递给UI组件props的key
// value作为传递给UI组件props的value 
// ——mapDispatchToProps用于创建操作状态的方法
function mapDispatchToProps(dispatch: any) {
    return { 
        incre: (data: number) => {
            dispatch(createIncrementAction(data))
        },
        decre: (data: number) => {
            dispatch(createDecrementAction(data))
        },
        increAsync: (data: number, time: number) => {
            dispatch(createIncrementAsyncAction(data, time))
        }
    }
}

—— src/pages/index.css

import styles from './index.less';
import Count from '../containers/Count'
import store from '../redux/store'
export default function IndexPage() {
  return (
    <div>
      <Count store={store}/>
    </div>
  );
}

—— src/redux/contant.ts

/* 
    该模块用于定义action对象中type类型的常量值,
    目的:便于管理的同时,防止程序员单词写错
        变量写错的话,会报错
*/
export const INCREMENT = 'increment'
export const DECREMENT = 'decrement'

—— src/redux/count_action.ts

/* 
   该文件专门为Count组件生成action对象 
*/
import { INCREMENT, DECREMENT } from './contant'
import store from './store'
// 同步action:action的值是Object类型的一般对象
export const createIncrementAction = (data: number) => (
    {type: INCREMENT, data}
)

export const createDecrementAction = (data: number) => (
    {type: DECREMENT, data}
)

// 异步action:action的值为函数;
// 异步action中一般都会调用同步action,异步action不是必须要调用的
export const createIncrementAsyncAction = (data: number, time:number) => {
    return () => {
        setTimeout(() => {
            // store.dispatch({type: INCREMENT, data})
            // 两种方法都可以,最好选择下面的写法
            store.dispatch(createIncrementAction(data))
        }, time)
    }
}

—— src/redux/count_reducer.ts

/*
    该文件用于创建一个为Count组件服务的reducer,reducer的本质是一个函数
    reducer函数接收两个参数:之前的状态preState,动作对象action
*/
import { INCREMENT, DECREMENT } from './contant'
// 初始化时,preState为undefined
const initState = 0
export default function countReducer (preState=initState, action: any) {
    // 从action对象中获取type和data
    const { type, data } = action
    switch(type) {
        case INCREMENT:
            return preState + data
        case DECREMENT:
            return preState - data
        default:
            return preState
    } 
}

—— src/redux/store.ts

/*
    该文件专门用于暴露一个store对象,整个应用只有一个store对象
*/
// 引入createStore,专门用于创建redux中最为核心的store对象
import { createStore, applyMiddleware } from 'redux'
// 引入为Count组件服务的reducer
import CountReducer from './count_reducer'
// 引入redux-thunk,用于支持异步action
import thunk from 'redux-thunk'
// 暴露store
export default createStore(CountReducer, applyMiddleware(thunk))

优化后:

—— mapDispatchToProps也可以是一个对象

在这里插入图片描述

—— store状态发生变化后,不再需要重新渲染

不需要再写subscribe
在这里插入图片描述

—— provider

如果组件中有很多容器组件,每一次都需要写store={store}

<Count store={store}/>
<Demo store={store}/>
<Demo1 store={store}/>

现在可以这样解决:
在入口文件中:

import React from 'react'
import ReactDom from 'react-dom'
import App from './App'
import store from './redux/store'
import { provider } from 'react-redux'

ReactDom.render(
	<Provider store={store}>	
		<App/>
	<Provider>,
	document.getElementById('root')
)

—— 整合UI组件和容器组件

在这里插入图片描述

—— 优化的总结

在这里插入图片描述
—— 代码:

import React, { useState } from 'react'
import  { 
    createIncrementAction,
    createDecrementAction,
    createIncrementAsyncAction
} from '../../redux/count_action'
// 引入connect用于连接UI组件与redux
import { connect } from 'react-redux' 

function CountUI(props:any) {
    console.log('UI组件接收到的props是', props)
    const [value, setValue] = useState<number>(0)
    const increment = () => { props.incre(value * 1) }
    const decrement = () => { props.decre(value * 1) }

    const select = (e: any) => {
        const index = e.target.selectedIndex // 选中项的index
        setValue(e.target.options[index].value) // 选中项的value值
    }
    return (
        <div>
            <h1>当前求和为: {props.count}</h1>
            <select onChange={select}>
                <option value="1">1</option>
                <option value="2">2</option>
            </select>
            <button onClick={increment}>+</button>&nbsp;
            <button onClick={decrement}>-</button>&nbsp;
        </div>
    )
}

// 映射状态
const mapStateoProps = (state: any) => ({count: state})
// 映射操作状态的方法
const mapDispatchToProps =  {
    incre: createIncrementAction,
    decre: createDecrementAction,
    increAsync: createIncrementAsyncAction
}
export default connect(mapStateoProps, mapDispatchToProps)(CountUI)
import styles from './index.less';
import store from '../redux/store'
import OptimizeCount from '../containers/OptimizeCount'

export default function IndexPage() {
  return (
    <div>
      <OptimizeCount store={ store }/>
    </div>
  );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react-redux库 的相关文章

随机推荐

  • 8086汇编寄存器及指令汇总

    1 寄存器的分类 通用寄存器 ax bx cx dx ah al bh bl ch cl dh dl sp bp si di 指令寄存器 ip 标志寄存器 FR 段寄存器 cs ds ss es 2 ax bx cx dx 这四个寄存器存放
  • 入门文献复现——Combining belief functions based on distance of evidence Deng Yonga,2, Shi WenKanga, Zhu Zhe

    这个Paper结合BOE之间的距离的思想 对Murphy的方法进行了改进 代码注解 虽然代码写的还是一如既往的臭 仅仅知识为了获得运行结果而写 但还是基本复现了Paper 基于加权质量的平均法 1 计算BOE之间的距离d m i m j 1
  • USB数据通道

    USB数据通道 USB Type C连接器是对称的 它复制了大多数信号 使其支持可翻转性 如图1所示 对于这类复制 需要支持超高速USB产品的数据通道多路复用器 以及支持交替模式产品的数据通道交叉开关 对于USB Type C数据通道 设计
  • PyQt5.QtWidgets.QWidget结构及用法

    分解 PyQt5是一个大的模块 是Qt在Python中的桥梁 QtWidgets是PyQt5下面的一个模块 包含了用于构建界面的一系列UI元素组件 QWidget是QtWidgets模块下面的一个类 QWidgetClass The QWi
  • 在Jmeter中使用自定义编写的Java测试代码

    我们在做性能测试时 有时需要自己编写测试脚本 很多测试工具都支持自定义编写测试脚本 比如LoadRunner就有很多自定义脚本的协议 比如 C Vuser Java Vuser 等协议 同样 Jmeter也支持自定义编写的测试代码 不过与L
  • 第五课:C++实现加密PDF文档解密

    目录 1 功能概述 2 示例代码 3 PDF加密原理 3 1 PDF加密方法 3 1 1 加密电脑本地PDF文件 3 1 2 在其他电脑上使用PDF文件 3 1 3 批量加密PDF文件 1 功能概述 请注意 未经授权的加密PDF文件解密是非
  • 如何在上海租房,数据有话说

    租房 一个上漂族绕不过的问题 租房者往往会去到58 豆瓣等租房信息发布平台查询数据 但简单的网页浏览却很难解决租房者不能全面认知上海租房市场的情况 这时候 如果会一点爬虫和数据分析技能 就会事半功倍 比如使用租房平台上的房源数据 搭建一款适
  • java中的类修饰符、成员变量修饰符、方法修饰符。

    类修饰符 public 访问控制符 将一个类声明为公共类 他可以被任何对象访问 一个程序的主类必须是公共类 abstract 将一个类声明为抽象类 没有实现的方法 需要子类提供方法实现 final 将一个类生命为最终 即非继承类 表示他不能
  • 爬虫之二手车

    import requests from lxml import etree headers User Agent Mozilla 5 0 Windows NT 10 0 Win64 x64 AppleWebKit 537 36 KHTML
  • 更改docker容器中的时间而不影响宿主机

    容器的时间问题 如果想要直接进入容器 使用date s修改日期 则会出现一个date cannot set date Operation not permitted的错误 而且也不会成功 这是由于docker容器的隔离是基于Linux的Ca
  • tensorflow 多GPU编程 完全指南

    人生苦短 我用pytorch 推荐大家使用 PyTorch分布式训练简明教程 PyTorch分布式训练基础 DDP使用 知乎 主要变动的位置包括 1 启动的方式引入了一个多进程机制 2 引入了几个环境变量 3 DataLoader多了一个s
  • 5折交叉验证的回归分析

    w lt read csv C Users Administrator Desktop mg csv header T 样本的个数为1385 5折交叉验证 n 1385 zz1 1 n zz2 rep 1 5 ceiling 1385 5
  • PTA 7-15 计算圆周率 (15 分)

    根据下面关系式 求圆周率的值 直到最后一项的值小于给定阈值 2 1 31 3 52 3 5 73 3 5 7 2n 1 n 输入格式 输入在一行中给出小于1的阈值 输出格式 在一行中输出满足阈值条件的近似圆周率 输出到小数点后6位 输入样例
  • 音视频基础(1)音视频处理流程

    文章目录 音视频基础 1 音视频处理流程 1 概要 2 音频处理流程 3 视频处理流程 4 直播客户端处理流程 5 音频数据流转 音视频基础 1 音视频处理流程 理解音频处理流程对我们做音视频开发至关重要 因为理解了这个处理流程之后 我们就
  • mysql用户授权

    mysql用户授权 1 grant授权 授权 添加用户并设置权限 命令格式 grant 权限列表 on 库名 表名 to 用户名 客户端地址 identified by 密码 with grant option with grant opt
  • draw.io环境搭建

    为什么80 的码农都做不了架构师 gt gt gt 前言 draw io是一款在github上的开源产品 由于需要构建在线文档 需要插入画图类型 对比多款开源产品 最终选择了draw io draw io图标资源非常的丰富 方便导入图标资源
  • Android——(高级控件下拉框与搜索框)

    1 高级控件与低级控件区别 是否使用适配器 2 适配器种类和作用 2 1 种类 数组适配器 ArrayAdapter new ArrayAdapter
  • MySQL - java链接mysql8 并兼容链接mysql5 亲测可用

    开始之前先去官网捋一遍 MySQL Connector J开发人员指南 看看官方的一些变动 和一些可能要注意的点 或者一些可能会踩到的坑 事先 我们要有一个使用mysql5 x的应用或者服务 需要修改的部分不算多 但是要想同时想兼容5 x和
  • java: cannot find symbol symbol: variable log

    使用Intellij idea的时候 编译项目始终报错java cannot find symbol symbol variable log 装Lombok Plugin 插件 设置 build execution deployment g
  • react-redux库

    安装react redux tnpm i react redux 未优化前 src components Count index tsx import React useState from react export default fun