React—11—redux

news/2025/3/5 2:20:25/文章来源:https://www.cnblogs.com/EricShen/p/18751295

 一、redux概念

◼ JavaScript开发的应用程序,已经变得越来越复杂了:
 JavaScript需要管理的状态越来越多,越来越复杂;
 这些状态包括服务器返回的数据、缓存数据、用户操作产生的数据等等,也包括一些UI的状态,比如某些元素是否被选中,是否显示
加载动效,当前分页;
◼ 管理不断变化的state是非常困难的:
 状态之间相互会存在依赖,一个状态的变化会引起另一个状态的变化,View页面也有可能会引起状态的变化;
 当应用程序复杂时,state在什么时候,因为什么原因而发生了变化,发生了怎么样的变化,会变得非常难以控制和追踪;
◼ React是在视图层帮助我们解决了DOM的渲染过程,但是State依然是留给我们自己来管理:
 无论是组件定义自己的state,还是组件之间的通信通过props进行传递;也包括通过Context进行数据之间的共享;
 React主要负责帮助我们管理视图,state如何维护最终还是我们自己来决定;
◼ Redux就是一个帮助我们管理State的容器:Redux是JavaScript的状态容器,提供了可预测的状态管理;
◼ Redux除了和React一起使用之外,它也可以和其他界面库一起来使用(比如Vue),并且它非常小(包括依赖在内,只有2kb)
 
 

Redux的三大原则

◼ 单一数据源
 整个应用程序的state被存储在一颗object tree中,并且这个object tree只存储在一个 store 中:
 Redux并没有强制让我们不能创建多个Store,但是那样做并不利于数据的维护;
 单一的数据源可以让整个应用程序的state变得方便维护、追踪、修改;
◼ State是只读的
 唯一修改State的方法一定是触发action,不要试图在其他地方通过任何的方式来修改State:
 这样就确保了View或网络请求都不能直接修改state,它们只能通过action来描述自己想要如何修改state;
 这样可以保证所有的修改都被集中化处理,并且按照严格的顺序来执行,所以不需要担心race condition(竟态)的问题;
◼ 使用纯函数来执行修改
 通过reducer将 旧state和 actions联系在一起,并且返回一个新的State:
 随着应用程序的复杂度增加,我们可以将reducer拆分成多个小的reducers,分别操作不同state tree的一部分;
 但是所有的reducer都应该是纯函数,不能产生任何的副作用;

 

 

二、在非脚手架中使用redux

redux是一个单独的库,所以可以在普通项目、vue、react中使用。

三、react中使用redux

我的理解是,createStore时必须有一个reducer函数,

store会主动调用reducer函数返回的state作为初始state;

 

后续,当我们使用dispatch取修改的时候,redux会主动调用reducer,然后reducer内部去做修改然后返回一个全新的state,

由于createStore是跟reducer强绑定的,所以store的数据也就跟着改变了。

 

 

第一:npm install redux

第二:专门建一个store文件夹,去实例化一个store,并且这个store的数据是由reducer提供的。

第三:其他组件可以通过store.getState取获取store数据的初始值

第四:想要修改store里的值,需要用到store.dispatch({type:'xxxxxx', params);

第五:当我们dispatch时,redux会自动帮助我们调用reducer函数,所以我们需要在reducer函数里做处理

reducer函数有两个参数,一个是旧state,一个是本次提出dispatch的action对象。

经过处理后,返回一个新的state(记住,reducer是一个纯函数,所以不要修改原旧state,要返回一个新的state。)

第六: redux把旧的state更新成reducer新返回的state

第七:通知所有订阅过(store.subcribe())的组件

 

 

import { createStore } from 'redux';
import * as actionTypes from './constants';// 定义常量
export const ADD_NUMBER = 'add_number';
export const SUB_NUMBER = 'sub_number';// 定义action
export const addNumberAction = num => ({type: ADD_NUMBER,num});export const subNumberAction = num => ({type: SUB_NUMBER,num});// 定义reducer函数
const initialState = {counter: 0
};
export function reducer(state = initialState, action) {switch (action.type) {case actionTypes.ADD_NUMBER:return { ...state, counter: state.counter + action.num };case actionTypes.SUB_NUMBER:return { ...state, counter: state.counter - action.num };default:return state;}
}// 实例化store
const store = createStore(reducer);export default store;

 


import React, { PureComponent } from 'react';
import Home from './pages/home';
import Profile from './pages/profile';
import './style.css';
import store from './store';

export class App extends PureComponent {constructor() {super();
this.state = {counter: store.getState().counter};}componentDidMount() {store.subscribe(() => this.setState({ counter: store.getState().counter }));}render() {const { counter } = this.state;return (<div><h1>App{counter}<Home></Home><Profile></Profile></h1></div> );} }export default App;

 

import React, { PureComponent } from 'react'
import store from "../store"
import { addNumberAction } from '../store/counter'export class Home extends PureComponent {constructor() {super()this.state = {counter: store.getState().counter,}}componentDidMount() {store.subscribe(() => {const state = store.getState()this.setState({ counter: state.counter })})}addNumber(num) {store.dispatch(addNumberAction(num))}render() {const { counter } = this.statereturn (<div><h2>Home Counter: {counter}</h2><div><button onClick={e => this.addNumber(1)}>+1</button><button onClick={e => this.addNumber(5)}>+5</button><button onClick={e => this.addNumber(8)}>+8</button></div></div>
    )}
}export default Home

 

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

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

相关文章

ENSP中路由配置实验(静态路由、NAT转换、项目实例搭建)

一、实验一:静态路由配置 现在管理员拥有这三个路由的控制权 1、要求使得三个局域网下的主机能够互相访问,具体地址分配见下图2、操作遇到一个插曲,启动路由器时报40号错误,查阅官方技术文档进行自检修复无果 最后终于找到一个解决方案,来自哔哩哔哩视频下的某个评论 其实是…

欢迎屏幕和新的用户帐户设置;当前用户、欢迎屏幕(系统帐户)和新用户帐户的设置;注册表位置

欢迎屏幕和新的用户帐户设置下面显示的是当前用户、欢迎屏幕(系统帐户)和新用户帐户的设置(S)。当前用户显示语言:中文(简体)输入语言:简体中文(中国大陆)-微软拼音格式:简体中文(中国大陆)位置:中国欢迎屏幕显示语言:中文(简体)输入语言:简体中文(中国大陆)-微软拼音格…

Codeforces Round 757 (Div. 2)

我不知道为什么要补这一个远古场,但是确实里面几道题有点意思。C. Divan and bitwise operations 显然,我们可以得到整个序列的按位或就是所有 \(x\) 的按位或,设为 \(S\)。 如果 \(S\) 的第 \(i\) 位为 \(0\),贡献即为 \(0\)。 否则总有一个 \(1\),当中恰有一个对应贡献为…

[AI/GPT/LLOps/AI中台] Dify : 开源AI大模型应用开发平台(Apache 2.0)

概述:DifyDify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。 即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。 由于 Dify 内置了构建 LLM 应用所需…

[AI/GPT] Dify : 开源AI大模型可视化终端应用(Apache 2.0)

概述:DifyDify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。 即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。 由于 Dify 内置了构建 LLM 应用所需…

在时光的褶皱里种一株月光

少年哇,你能同时拥有青春和对青春的感受吗?——欲买桂花同载酒,终不似,少年游!晨露未晞时,凝视窗台上的水痕,那些蜿蜒的纹路像极了未被解码的生命线。某个起雾的清晨突然懂得,人生原是时光长河里的倒影——我们总在追逐波光粼粼的远方,却不知每一道涟漪的褶皱里,都藏…

Jenkins 自动化搭建测试环境

安装 Jenkins 下载地址:https://www.jenkins.io/zh/ 博主服务器是jdk1.8,需要安装 2.346.1 或之前版本。下载war包即可。启动 Jenkins: java -jar jenkins.war --httpPort=8080启动成功后访问 http://localhost:8080/查看并输入密码文件中的管理员密码可以安装推荐的插件,更…

一文讲透 AI Agent 与 AI Workflow

一、引言 在人工智能技术快速迭代的今天,我们正见证着 AI 应用模式的多元化发展。 其中,AI Agent 和 AI Workflow 作为两种截然不同的范式,正在重塑我们对 AI 应用的认知。 这两种模式就像是同一枚硬币的两面 —— 一个追求灵活创新,另一个注重稳定高效。 今天正好在群里有…

postman上传图片的base64

不要添加前缀 控制器和类@PostMapping("text-only")public List<TextDto> ocrTextOnly(@RequestBody OcrParam ocrParam) {//TODOreturn ocrapiService.ocrText(ocrParam.getImgBase64(),ocrParam.getImgType());}@Data @NoArgsConstructor @AllArgsConstructo…

关于从化0你想知道的都在这里

https://xsjcloud.com V*x:gzydc0 先上AI: 广州移动的从化0月租卡,即“神州行大众卡”,以其0月租、接听免费的特点受到关注。然而,根据现有信息,该套餐已下架,成为绝版。目前,办理此套餐需要通过特定渠道,且需在广州润粤营业厅激活号码。优点:无月租费用:真正实现0月…

当懒惰遇上AI:我如何用Coze让大模型帮我整理2.5万字课程笔记

能写代码绝不动手,能用AI绝不写代码 —— AI粉嫩特攻队信条通过本文学会打造这个AI工具,只有一个要求:识字且会上网! 一个小困扰 有朋友最近在上一位大佬的线上直播课程,感叹道: "老师讲得很好但节奏太快,根本来不及记录详细笔记,只能速记要点。课后想不起完整内容又…

WiFiGrab教程1:一键抓包隐藏WiFi并获取SSID

介绍图形化无线安全审计软件WiFiGrab,并演示使用其抓包隐藏WiFi获取无线网络名称。WiFiGrab一键抓握手包 WiFiGrab是一款实用的无线安全审计软件,该软件使用简单,图形化操作界面,无需安装,一键启动,一键捕获握手报文。可自动显示隐藏SSID、支持2.4G和5G抓包。软件下载链接…