React16、18 使用 Redux

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.listnewList.push(this.inputRef.value)store.dispatch({type: 'changeList',value: newList})this.setState({inputValue: ''})}handledel(index) {const list = this.state.listlist.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.listnewList.push(inputRef.current.value)store.dispatch({type: 'changeList',value: newList})setValue('')}const handledel = (key) => {const list = state.listlist.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.hqwc.cn/news/103367.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NPM 常用命令(六)

1、npm explain 1.1 命令使用 npm explain <package-spec>别名: why 1.2 描述 此命令将打印导致在当前项目被其他引用包的依赖链。 如果提供了一个或多个包规范&#xff0c;则只有与其中一个说明符匹配的包才会解释它们的关系。 包规范还可以引用 ./node_modules 中…

关于测试的思考-质量保障体系

一、质量保障体系 1、质量保障体系说明 2、如何构建质量保障体系 3、质量保障案例 二、敏捷开发下的软件测试 1、互联网公司敏捷流程的实践 2、提升测试上线质量&#xff08;质量右移&#xff09;&#xff1a; 灰度方式&#xff1a;根据机器&#xff0c;根据用户画像&#xff…

const int* , const int * const, int * const之间的区别

const int * p、int * const p 和 const int * const p 是指针声明中的三种常见形式&#xff0c;它们之间有以下区别&#xff1a; const int * p: 这表示 p 是一个指向常量整数的指针。指针 p 是可变的&#xff08;mutable pointer&#xff09;&#xff0c;可以改变它所指向的对…

【Docker】容器化应用程序的配置管理策略与实践

一、引言 1.1 Docker的背景和优势 Docker是一种开源的容器化平台&#xff0c;简化应用程序的打包、交付和运行过程。基于Linux容器技术&#xff0c;通过提供一个轻量级、可移植和自包含的容器来实现应用程序的隔离和部署。 在传统的应用程序开发和部署中&#xff0c;往往需要…

2023数模A题——定日镜场的优化问题

A题——定日镜场的优化问题 思路&#xff1a;该题主要考察的几何知识和天文学知识&#xff0c;需要不同角度下的镜面和遮挡情况。 资料获取 问题1&#xff1a; 若将吸收塔建于该圆形定日镜场中心&#xff0c;定日镜尺寸均为 6 m6 m&#xff0c;安装高度均为 4 m&#xff0c;且…

Unity Shader 溶解效果

一、效果图 二、原理分析 实现原理就是在片元着色器中&#xff0c;对像素点进行丢弃不显示。借助美术做的噪点图(利用噪点图中rgb中r值来做计算)。比如噪点图r值从0-1。我们从小到大让r值逐渐丢弃&#xff0c;比如刚开始r < 0.1丢弃&#xff0c;然后t < 0.2丢弃...知道t…

【Unity】Unity坑的集锦之RenderTexture打包黑屏

问题&#xff1a;Camera Output Texture设置RenderTexture后&#xff0c;打包用来Save PNG&#xff0c;黑屏 如果你打AB 包&#xff0c;然后是相机的OutputTexture是拖拽的话&#xff0c;记得将包一起打入 或者你可以代码赋值 Camera.targetTexture await Loader.LoadAsset&l…

BUUCTF刷题十一道(08)

文章目录 [HITCON 2017]SSRFme[b01lers2020]Welcome to Earth[CISCN2019 总决赛 Day2 Web1]Easyweb[SWPUCTF 2018]SimplePHP[NCTF2019]SQLi[网鼎杯 2018]Comment[NPUCTF2020]ezinclude[HarekazeCTF2019]encode_and_encode[CISCN2019 华东南赛区]Double Secret[网鼎杯2018]Unfin…

Python入门教程 | Python3 列表(List)

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…

【LeetCode-中等题】79. 单词搜索

文章目录 题目方法一&#xff1a;递归 回溯 题目 方法一&#xff1a;递归 回溯 需要一个标记数组 来标志格子字符是否被使用过了先找到word 的第一个字符在表格中的位置&#xff0c;再开始递归递归的结束条件是如果word递归到了最后一个字符了&#xff0c;说明能在矩阵中找到单…

AFL++模糊测试

一、AFL 这里我们主要使用AFL Fuzzing 测试IOT的二进制文件&#xff0c;当我们解压提取一个固件时&#xff0c;能够获得大量的IOT二进制应用 &#xff0c;如果要进行漏洞挖掘则需要将二进制文件进行逆向分析&#xff0c;然后查找危险函数以及输入接口&#xff0c;对于一个大型的…

java从入门到起飞(八)——循环和递归

文章目录 Java循环1. 什么是循环&#xff1f;1.1 为什么需要循环&#xff1f;1.2 循环的分类 2. Java中的循环结构2.1 for循环2.2 while循环2.3 do-while循环 3. 循环控制语句3.1 break语句3.2 continue语句 4. 总结 Java递归1. 什么是递归2. 递归的原理3. 递归的实现4. 递归的…