Redux - Redux在React函数式组件中的基本使用

在这里插入图片描述

文章目录

    • 一,简介
    • 二,安装
    • 三,三大核心概念Store、Action、Reducer
      • 3.1 Store
      • 3.2 Reducer
      • 3.3 Action
    • 四,开始函数式组件中使用
      • 4.1,引入store
      • 4.1,store.getState()方法
      • 4.3,store.dispatch()方法
      • 4.4,store.subscribe()方法
    • 五,Redux 的三大原则

一,简介

Redux 是 JavaScript 应用的状态容器,提供可预测的状态管理。

它主要的几个方法如下:

在这里插入图片描述
重要的有方法 有 dispatch(分发action)getState(获取state)subscribe(监听state的变化),下面会介绍到,另外两个可以不用管;


那什么时候使用Redux呢?

当遇到如下问题时,建议开始使用 Redux

  1. 你有很多数据随时间而变化
  2. 你希望状态有一个唯一确定的来源(single source of truth)
  3. 你发现将所有状态放在顶层组件中管理已不可维护

二,安装

我这里安装的是 "redux": "^4.2.1"版本;

npm install redux --save

项目的src目录下面新建store文件夹index.js,reducer.js;如下:

在这里插入图片描述

三,三大核心概念Store、Action、Reducer

3.1 Store

Store:存储数据的地方。最好整个应用只有一个 Store。

createStore() :用来生成 Store。接收 Reducer 作为其参数。

index.js

/*** 引入createStore 专门创建最为核心的store对象* 目前createStore已经弃用,所以我们要引用legacy_createStore */iimport { legacy_createStore } from "redux";
import reducer from './reducer.ts'// 创建数据仓库 引入reducer函数进行对数据的处理
const store = legacy_createStore(reducer)export default store

3.2 Reducer

reduce的本质就是一个函数 ,作用是初始化状态和加工状态。

reduce函数里面接收两个参数,第一个参数是state的初始值,第二个参数是一个action对象,对象里的第一个属性是type也就是函数的名称,第二个属性就是传进来的值,用于后续更改state;

reducer.ts


// 约束类型
interface Eula {name: string;age: number;
}
// 定义数据
const defaultState: Eula = {name: "Eula",age: 18
};// reducer 函数 用于更改数据
let reducer = (preState = defaultState, action: { type: string; data: number }) => {// action解构出来let { type, data } = action;// 第一种写法 每个分支使用return进行返回// switch (type) {//   case "update_age"://     preState.age = data;//     return preState;//   case "add_age"://     preState.age++;//     return preState;//   case "del_age"://     preState.age--;//     return preState;//   default://     return preState; // 初始化时// }// 第二种写法 break 与最终的return返回结果switch (type) {case "update_age":preState.age = data;break;case "add_age":preState.age++;break;case "del_age":preState.age--;break;default:preState; // 初始化时}return preState;  // 此处 一定要使用return进行返回最终改变的值
};export default reducer;

注意: 初次加载 Store 会自动调用一次 Reducer 进行初始化状态,此时 state 是 undefined,action 对象中的 type 为 @@redux/INITxxx。手动调用 store.dispatch() 也会触发 Reducer 的自动执行。

3.3 Action

Action 就是一个普通的 JS 对象,用于描述要更新的数据类型和内容,其中 type 属性是必须的,表示 Action 的名称,其他属性可以自由设置。

redux.tsx

// 引入store
import store from "../../../store/index";
// 更改数据时调用
store.dispatch({ type: "update_age", data: 100 });

store.dispatch():所有数据的变化,必须通过派发(dispatch) Action 来更新。接受一个 Action 对象作为参数,将其发送出去。

四,开始函数式组件中使用

redux.tsx

import React, { useState } from "react";
//  1,引入store
import store from "../../../store/index";// 渲染数据
const myList:[] = [];const Redux: React.FC = () => {let [list, setList] = useState(myList);console.log("store:", store);// 监听数据的变化const unsubscribe = store.subscribe(() => {console.log("订阅数据的变化", store.getState());// 此处用来触发视图的更新setList([]);});// 改变store中的数据const update = () => {store.dispatch({ type: "update_age", data: 100 });};const add = () => {store.dispatch({ type: "add_age" });};const del = () => {store.dispatch({ type: "del_age" });};// 此处才是真正渲染的页面return (<div className="redux"><h3>redux演示</h3><button onClick={update}>更改store的数据+100</button><button onClick={add}>更改store的数据++</button><button onClick={del}>更改store的数据--</button><p>store的num数据:{store.getState().age}</p></div>);
};
export default Redux;

效果图:

在这里插入图片描述

上面的组件是一个简单的案例演示,定义了三个点击事件,点击第一个按钮state.age+100,点击第二个按钮每次state.age+1,点击第三个按钮age每次减一;下面会详细介绍几个重点内容:

4.1,引入store

先引进来,这个没什么好说的;

import store from "../../../store/index";

4.1,store.getState()方法

getState()方法是redux实例下的方法之一,上面的第一张截图已经通过store实例打印出来了;

getState()的作用是获取当前状态下运行在redux中的state;也就是说获取store中最新的数据;

   <p>store的num数据:{store.getState().age}</p>

4.3,store.dispatch()方法

dispatch() 是唯一能够修改 state 数据的行为。通过分发action (其实就是一个对象),配合 dispatch 函数传入的 action 及其 payload 计算得到新的 state,并更新到闭包数据中,这样就实现了 state 的更新;

如下:
reducer.tsx

  // 改变store中的数据const update = () => {store.dispatch({ type: "update_age", data: 100 });};const add = () => {store.dispatch({ type: "add_age" });};const del = () => {store.dispatch({ type: "del_age" });};

上面的代码会和下面的 switch case 表达式所判断的type要一 一对应,用于更新state;

reducer.ts

let reducer = (preState = defaultState, action: { type: string; data: number }) => {let { type, data } = action;// 第一种写法 每个分支使用return进行返回// switch (type) {//   case "update_age"://     preState.age = data;//     return preState;//   case "add_age"://     preState.age++;//     return preState;//   case "del_age"://     preState.age--;//     return preState;//   default://     return preState; // 初始化时// }// 第二种写法 break 与最终的return返回结果switch (type) {case "update_age":preState.age = data;break;case "add_age":preState.age++;break;case "del_age":preState.age--;break;default:preState; // 初始化时}return preState;  // 此处 一定要使用return进行返回最终改变的值
};

上面的两种写法是一样的;对比一下;

4.4,store.subscribe()方法

subscribe函数只要store中的state数据变化了,就会触发subscribe方法,相当注册了一个监听器;监听store中的数据变化;

从 react 层面来说,redux 的 store 是隔离开的,我们需要一个桥梁,使得数据层出现更新的同时更新UI层逻辑,这时 store 中的最后一个方法,subscribe 方法就派上用场了。

注意: setList([]):是为了主动触发react视图更新的方法,否则store中数据改变了,视图却没有重新渲染。

import React, { useState } from "react";
const Redux: React.FC = () => { let [list, setList] = useState(myList);
// 监听数据的变化const unsubscribe = store.subscribe(() => {console.log("订阅数据的变化", store.getState());// 此处用来触发视图的更新setList([]);});
}

subscribe也同时返回了一个 unsubscribe 函数。当我们不在希望订阅这个监听器时,调用 unsubscribe(),对应的函数就会从监听器队列中被移除。

unsubscrib() // 不再监听

五,Redux 的三大原则

  1. 单一数据源:整个应用程序的 State 被存储在一棵 object tree 中,并且这棵 object tree 只存储在一个 Store 中。单一数据源可以让整个应用程序的 State 变得方便维护、修改、追踪。
  2. State 是只读的:唯一修改 State 的方法就是触发 Action,不要试图在其他地方通过任何的方式来修改State。这样可以保证所有的修改都被集中化处理,并且按照严格的顺序来执行。
  3. 使用纯函数来执行修改:通过 Reducer 将旧的 State 和 Action 联系在一起,返回一个新的 State。所有的Reducer 都应该是纯函数,不能产生任何的副作用。

End:


[redux中文网]: https://cn.redux.js.org/

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

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

相关文章

深入了解 Rancher Desktop 设置

Rancher Desktop 设置的全面概述 Rancher Desktop 拥有方便、强大的功能&#xff0c;是最佳的开发者工具之一&#xff0c;也是在本地构建和部署 Kubernetes 的最快捷方式。 本文将介绍 Rancher Desktop 的功能和特性&#xff0c;以及 Rancher Desktop 作为容器管理平台和本地…

人工智能原理(2)

目录 一、知识与知识表示 1、知识 2、知识表示 3、知识表示方法 二、谓词逻辑表示法 1、命题逻辑 2、谓词逻辑 三、产生式表达法 1、知识的表示方法 2、产生式系统组成 3、推理方式 4、产生式表示法特点 四、语义网络 1、概念及结构 2、语义网络的基本语义联系 …

zookeeper案例

目录 案例一&#xff1a;服务器动态上下线 服务端&#xff1a; &#xff08;1&#xff09;先获取zookeeper连接 &#xff08;2&#xff09;注册服务器到zookeeper集群&#xff1a; &#xff08;3&#xff09;业务逻辑&#xff08;睡眠&#xff09;&#xff1a; 服务端代码…

Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】

一、创建一个apicases.xlsx放入到eclipse的resource里面&#xff0c;然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的对应目录下放入features和plugins&#xff0c;重启eclipse就可以看到testNG了 <!--poi excel解析 --><d…

运维监控学习笔记3

DELL的IPMI页面的登录&#xff1a; 风扇的状态&#xff1a; 电源温度&#xff1a;超过70度就告警&#xff1a; 日志信息&#xff1a; 可以看到更换过磁盘。 iDRAC的设置 虚拟控制台&#xff1a;启动远程控制台&#xff1a; 可以进行远程控制。 机房工程师帮我们接远程控制&…

【云原生】kubernetes中容器的资源限制

目录 1 metrics-server 2 指定内存请求和限制 3 指定 CPU 请求和限制 资源限制 在k8s中对于容器资源限制主要分为以下两类: 内存资源限制: 内存请求&#xff08;request&#xff09;和内存限制&#xff08;limit&#xff09;分配给一个容器。 我们保障容器拥有它请求数量的…

【云原生】K8S集群

目录 一、调度约束1.1 POT的创建过程1.1调度过程 二、指定节点调度2.1 通过标签选择节点 三、亲和性3.1requiredDuringSchedulingIgnoredDuringExecution&#xff1a;硬策略3.1 preferredDuringSchedulingIgnoredDuringExecution&#xff1a;软策略3.3Pod亲和性与反亲和性3.4使…

山东布谷科技直播平台搭建游戏开发技术分享:数据存储的重要意义

在市场上的热门的直播平台中&#xff0c;有很多小程序为用户提供各种各样的功能&#xff0c;这其中就有很多游戏小程序&#xff0c;当今社会独生子女众多&#xff0c;很多作为独生子女的用户都会去选择一个能够社交互动的APP来填补内心的空虚&#xff0c;而直播平台的实时互动的…

SAP 选择屏幕组件名描述翻译时字符长度不够问题处理

问题&#xff1a;有时候我们在开发report程序的时候&#xff0c;要求程序显示支持中英文&#xff0c;如果程序是在中文环境下开发的时候&#xff0c;需要进行翻译处理&#xff0c;但是我们发现选择屏幕上的组件的描述支持的默认长度是30位&#xff0c;如果超过该如何处理呢 解…

构建一个LLM应用所需的所有信息

一、说明 您是否对大型语言模型&#xff08;LLM&#xff09;的潜力感兴趣&#xff0c;并渴望创建您的第一个基于LLM的应用程序&#xff1f;或者&#xff0c;也许您是一位经验丰富的开发人员&#xff0c;希望简化工作流程&#xff1f;看看DemoGPT就是您的最佳选择。该工具旨在简…

【软件测试】Linux环境下Docker搭建+Docker搭建MySQL服务(详细)

目录&#xff1a;导读 前言 一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Linux之docker搭…

CDN(内容分发网络)

CDN的全称是 Content Delivery Network, 即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;降低网络拥塞&a…

详谈MongoDB的那些事

概念区分 什么是关系型数据库 关系型数据库&#xff08;Relational Database&#xff09;是一种基于关系模型的数据库管理系统&#xff08;DBMS&#xff09;。在关系型数据库中&#xff0c;数据以表格的形式存储&#xff0c;表格由行和列组成&#xff0c;行表示数据记录&…

神秘的ip地址8.8.8.8,到底是什么类型的DNS服务器?

下午好&#xff0c;我的网工朋友。 DNS&#xff0c;咱们网工配置网络连接或者路由器时&#xff0c;高低得和这玩意儿打交道吧。 它是互联网中用于将人类可读的域名&#xff08;例如http://www.example.com&#xff09;转换为计算机可理解的IP地址&#xff08;例如192.0.2.1&a…

元宇宙核能发电VR模拟仿真实训教学为建设新型电力系统提供重要支撑

随着“碳达峰、碳中和”目标与建设新型能源体系的提出&#xff0c;在元宇宙环境下建设电力系统是未来发展的趋势。以物联网、区块链、数字孪生、混合现实等技术为主要代表的元宇宙技术体系及其在电力和能源系统中的应用&#xff0c;将会促进智能电网的发展&#xff0c;为建设新…

Oracle 知识篇+分区表上的索引由global改为local注意事项

★ 知识点 二、知识点 Local型索引有如下优点 1.Only one index partition must be rebuilt when a maintenance operation other than SPLIT PARTITION or ADD PARTITION is performed on an underlying table partition. 2.The duration of a partition maintenance opera…

【uniapp】使用Vs Code开发uniapp:

文章目录 一、使用命令行创建uniapp项目&#xff1a;二、安装插件与配置&#xff1a;三、编译和运行:四、修改pinia&#xff1a; 一、使用命令行创建uniapp项目&#xff1a; 二、安装插件与配置&#xff1a; 三、编译和运行: 该项目下的dist》dev》mp-weixin文件导入微信开发者…

unity vscode 代码关联 跳转 BUG

一早打开电脑发现代码关联失效了&#xff0c;目测可能跟昨天一些插件更新有关 结论 就这货&#xff0c;开了就没法提示代码关联&#xff0c;估计预览版全是BUG。 另一个坑 同期有个unity插件也是预览版&#xff0c;“非常好使”&#xff0c;当场去世。评论点开有好几个人说用…

替代阿托斯DLKZOR-T/DLHZO-TES直动式伺服阀比例阀

DLKZOR-T/DLKZOR-TES直动式伺服阀比例阀结构&#xff1a; 1&#xff0c;LVDT传感器 2&#xff0c;比例电磁铁 3&#xff0c;阀体 4&#xff0c;阀套 5&#xff0c;阀芯 6&#xff0c;复位弹簧 7&#xff0c;集成数字放大器 8&#xff0c;七芯插头 9&#xff0c;RS232通…

[保研/考研机试] 杨辉三角形 西北工业大学复试上机题 C++实现

题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 输入n值&#xff0c;使用递归函数&#xff0c;求杨辉三角形中各个位置上的值。 输入描述: 一个大于等于2的整型数n 输出描述: 题目可能有多组不同的测试数据&#xff0c;对于每组输入数据&#xff0c; 按题目的要求输…