React16、18 使用 Redux

news2025/2/26 16:01:04

Redux 核心

Redux 介绍

Redux 是javaScript 状态容器,提供可预测化的状态管理

Redux 工作流程

在这里插入图片描述

Actions:对象,描述对状态进行怎样的操作

Reducer:函数,操作状态并返回新的状态

Store:存储状态的容器,JavaScript对象

View:视图,HTML页面

React 16 使用 Redux

安装

npm install --save redux

创建 store 仓库

src 目录下创建一个 store 文件夹,然后在文件夹下创建一个 index.js 文件

import { legacy_createStore as createStore } from "redux";
import reducer from "./reducer";

const store = createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()) // 创建数据存储仓库

export default store

store 文件夹下创建一个 reducer.js 文件

const defaultstate = {
    list: [1,2,3,4,5,6],
    inpuValue: ''
}

export default (state = defaultstate) => {
    return state;
}

在页面中使用

src 目录下创建 TodoList.js 页面

constructor 引入

this.state=store.getState();

使用

this.state.list

通过 dispatch 修改里面的值

store.dispatch({
   type: 'changeList',
   value: newList
})

reducer.js 添加对应的方法

const defaultstate = {
    list: [1,2,3,4,5,6],
    inpuValue: ''
}

export default (state = defaultstate, action) => {
    switch(action.type) {
        case "changeList":
            return {
                ...state,
                list: action.value
            }
        default:
            return state;
    }
}

constructor 添加 订阅Redux的状态

this.storeChange = this.storeChange.bind(this) 
store.subscribe(this.storeChange) 

编写storeChange方法

storeChange(){
    this.setState(store.getState())
}

完整代码

import React, { Component } from 'react';
import store from './store'

class TodoList extends Component {
	 constructor(props){
     super(props)
     this.state=store.getState();
     this.storeChange = this.storeChange.bind(this)
		 store.subscribe(this.storeChange) 
	 }
	 
	 handleChange(){
			this.setState({
        inputValue:this.inputRef.value
    	})
   }
   
   handleAdd() {
   		let newList = this.state.list
      newList.push(this.inputRef.value)
      store.dispatch({
          type: 'changeList',
          value: newList
      })
      this.setState({
        inputValue: ''
    	})
   }
   
   handledel(index) {
   		const list = this.state.list
      list.splice(index, 1)
      store.dispatch({
          type: 'changeList',
          value: list
      })
   }
   
   storeChange(){
     this.setState(store.getState())
   }
	 
   render() { 
        return ( 
            <div>
            	<div>
                <input ref={(inputRef)=>{this.inputRef=inputRef}} value={this.state.inputValue} onChange={handleChange.bind(this)} />
                <button onClick={handleAdd.bind(this)}>新增</button>
            	</div>
            	{this.state.list.map((item, index) => {
       					 return (<div key={index}><p>{item}<span onClick={() => handledel(index).bind(this)}> 删除</span></p></div>)
    					})}
        	</div>
         );
    }
}

export default TodoList;

React 18 使用 Redux

安装、创建仓库都与16一样

使用

正常引入,用一个变量接收

import store from './store'
const state = store.getState()

使用的时候 直接state.xxx 就能使用

    const items = state.list.map((item, index) => {
        return (<div key={index}><p>{item}<span onClick={() => handledel(index)}> 删除</span></p></div>)
    })

修改

一样通过 dispatch

store.dispatch({
    type: 'changeList',
    value: list
})

为了能让页面实时更新,必须手动更新

使用 react自带的 useEffect 方法,通过 subscribe 监测store更新的函数

useEffect(() => {
        // store.subscribe()是redux提供的,监测store更新的函数
        store.subscribe(() => {
            // 当store数据更新后执行 setUpdate() ,组件重新加载,实现界面store数据更新
            setUpdate({})
        })
    })
const [update,setUpdate] = useState({})

完整代码

import React, { useRef, useState, startTransition, useEffect } from 'react';
import store from './store'

const TotoList = () => {
    const inputRef = useRef()

    const state = store.getState()

    const [update,setUpdate] = useState({})

    const [value, setValue] = useState('')

    const items = state.list.map((item, index) => {
        return (<div key={index}><p>{item}<span onClick={() => handledel(index)}> 删除</span></p></div>)
    })

    const handleChange = () => {
        startTransition(()=> {
            setValue(inputRef.current.value)
        })
    }

    const handleAdd = () => {
        let newList = state.list
        newList.push(inputRef.current.value)
        store.dispatch({
            type: 'changeList',
            value: newList
        })
        setValue('')
    }

    const handledel = (key) => {
        const list = state.list
        list.splice(key, 1)
        store.dispatch({
            type: 'changeList',
            value: list
        })
    }


    useEffect(() => {
        // store.subscribe()是redux提供的,监测store更新的函数
        store.subscribe(() => {
            // 当store数据更新后执行 setUpdate() ,组件重新加载,实现界面store数据更新
            setUpdate({})
        })
    })

    return (
        <div>
            <div>
                <input ref={inputRef} value={value} onChange={handleChange} />
                <button onClick={handleAdd}>新增</button>
            </div>
            {items}
        </div>
    )
}

export default TotoList;

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

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

相关文章

【面试】Redis的热key问题如何发现和解决?

文章目录 背景一、怎么发现热key1.1 方法一:凭借业务经验&#xff0c;进行预估哪些是热key1.2 方法二:在客户端进行收集1.3 方法三:在Proxy层做收集1.4 方法四:用redis自带命令1.5 方法五:自己抓包评估 二、如何解决2.1. 利用二级缓存2.2. 备份热key2.3 永不过期2.4 分布式锁 三…

分享5个和安全相关的 VSCode 插件

开发高质量的软件应用程序可能是艰巨的&#xff0c;因为许多组成部分必须协同工作才能创建出一个可运行的解决方案。这就是为什么开发人员需要尽可能获得所有帮助和便利&#xff0c;特别是在保护他们的应用程序时。 Visual Studio Code&#xff08;VSCode&#xff09;是最受欢迎…

redis高可用——主从复制、哨兵模式、cluster集群

1、redis群集有三种模式 分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cIustr群集 主从复制:主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的…

jenkins创建用户

一.背景 之前用了很多次&#xff0c;现在转到甲方爸爸的岗位&#xff0c;要培养大学毕业生&#xff0c;才发现好记性不如烂笔头。给年轻人写出来。 二.创建用户的过程 1.用户管理界面入口 Dashboard>Manage Jenkins>Jenkins own user database 2.点击右边的按钮“Cre…

Arm 架构 Ubuntu 使用 Docker 安装 Gitlab 并使用

官方 gitlab 文档 我的系统是 arm 架构的 ubuntu 官网没有提供 arm 架构的 docker 的 gitlab 的安装方式&#xff0c;直接安装的也是后来加的&#xff0c;文档也是随笔带过&#xff0c;&#xff0c;&#xff0c;我用到了&#xff0c;记录一下 默认已经安装了 docker 在 docker …

【STM32】常用存储器

常用存储器 RAM 存储器 RAM 是“Random Access Memory”的缩写&#xff0c;被译为随机存储器。所谓“随机存取”&#xff0c;指的是当存储器中的消息被读取或写入时&#xff0c;所需要的时间与这段信息所在的位置无关。而RAM可随读取其内部任意地址的数据&#xff0c;时间都是…

Android 12.0 禁用系统app首次启动动画SplashScreen功能分析

1.前言 在12.0的系统开发中,由于系统增加了新特性,在app首次启动的时候,添加了启动引导动画SplashScreen功能,所以会默认显示 app图标作为一张动画来过度,解决首次启动卡顿问题,接下来分析下看是怎么样添加的,然后禁用就可以了 如图: 2.禁用系统app首次启动动画SplashSc…

关于mybatisplus报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplat的问题

可能是mybatisplus版本不兼容的问题&#xff0c;我之前用的3.4.0&#xff0c;springboot版本是3.1.3&#xff0c;maven版本是3.8.8&#xff0c;运行的时候报了这个错。现在修改了mybatisplus的版本&#xff0c;如下图&#xff1a; 这样就不报错了。 大家可以在这里找合适的my…

DGA行为转变引发了对网络安全的担忧

Akamai的研究人员发现&#xff0c;在域名系统(DNS)流量数据中&#xff0c;动态种子域生成算法(DGA)家族的行为发生了令人担忧的变化。这一发现揭示了恶意行为者如何调整他们的策略来延长他们的指挥与控制(C2)通信通道的寿命&#xff0c;以保护他们的僵尸网络。 从技术角度来看…

Excel文件生成与下载(SpringBoot项目)(easypoi)

说明 通过接口&#xff0c;导出表格。 使用SpringBoot框架和easypoi表格解析框架&#xff0c;生成Excel表格&#xff0c;并通过接口下载。 表格示例 依赖 版本 <easypoi.version>4.4.0</easypoi.version>依赖 <!-- easypoi --> <dependency><…

Matlab图像处理之Lee滤波器

目录 一、前言:二、LEE滤波器2.1 LEE滤波器原理2.2 LEE滤波器实现步骤三、MATLAB代码示例一、前言: LEE滤波器是一种常用于合成孔径雷达(SAR)图像去噪的滤波器。它能增强图像的局部对比度。今天我们将通过MATLAB来实现这种滤波器。 二、LEE滤波器 2.1 LEE滤波器原理 LEE滤…

Linux Debian12将本地项目上传到码云(gitee)远程仓库

一、注册码云gitee账号 这个可以参考其他教程&#xff0c;本文不做介绍。 gitee官网&#xff1a;https://gitee.com/ 二、Linux Debian12安装git 如果Linux系统没有安装git&#xff0c;可以使用下面命令安装git sudo apt install git 三、gitee新建仓库 我这只做测试&…

关于el-date-picker组件修改输入框以及下拉框的样式

因为业务需求&#xff0c;从element plus直接拿过来的组件样式和整体风格不搭&#xff0c;所以要修改样式&#xff0c;直接deep修改根本不生效&#xff0c;最后才发现el-date-picker组件有一个popper-class属性&#xff0c;通过这个属性我们就能够修改下拉框的样式&#xff0c;…

SpringMVC之CRUD(直接让你迅速完成部署)

一、项目创建 首先创建一个基于maven的项目部署&#xff0c;如果有些插件没有的话可以参考mybatis入门Idea搭建 二、配置依赖导入 依赖导入 1、pom.xml 需要根据自己的文件来进行导入&#xff0c;并不是原本照着导入 <project xmlns"http://maven.apache.org/POM/4.0.0…

安防视频监控平台EasyCVR可视化管理平台助力森林公园安全

EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度高、部署轻快&#xff0c;在智慧工地、智慧园区…

macOS Ventura 13.5.2(22G91)发布,附黑/白苹果镜像下载地址

系统介绍&#xff08;下载请百度搜索&#xff1a;黑果魏叔&#xff09; 黑果魏叔 9 月 8 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5.2 更新&#xff08;内部版本号&#xff1a;22G91&#xff09;&#xff0c;本次更新距离上次发布隔了 21 天。 本次更新查…

【备忘】清理Office缓存

【背景】电脑安装了M365 Apps for enterprise的客户端&#xff0c;遇到不常见的奇怪问题。尝试看清理缓存是否可以解决。 【清理步骤】 1. 关闭所有Office365 应用&#xff1b; 2. 搜索 %AppData% &#xff0c;并打开该文件夹&#xff1b; 3. 进到 AppData > Local > M…

单片机控制直流电机

硬件电路 芯片 单片机的GPIO不能直接连接电机&#xff0c;IO的电流不够或者会烧坏芯片&#xff0c;需要连接一个驱动芯片 &#xff0c;ULN2003 是输入高&#xff0c;输出为低 ULN2003 要输出高电平&#xff0c;必须在输出口外接上拉电阻&#xff0c;所以 将 ULN2003 的 2 个输…

UMA 2 - Unity Multipurpose Avatar☀️四.UMA人物部位的默认颜色和自定义(共享)颜色

文章目录 🟥 人物颜色介绍1️⃣ 使用默认颜色2️⃣ 使用自定义颜色🟧 UMA自定义颜色的作用🟨 自定义颜色还可作为共享颜色🟥 人物颜色介绍 UMA不同部位的颜色分为默认的内置颜色和我们新定义的颜色. 1️⃣ 使用默认颜色 比如不勾选UseSharedColor时,使用的眼睛的默认…

uni-app 之 uni.request 网络请求API接口

uni-app 之 uni.request 网络请求API接口 image.png <template><!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--><view>--- uni.request 网络请求API接口 ---<view><!-- 免费的测试接口 --…