四十七----redux

news2024/11/25 20:32:42

一、redux

redux⽤于状态集中存储,状态的更新必须是⼀种可预测的⽅式更新。严格的单向数据流是Redux架构的设计核⼼。 这意味着应⽤中所有的数据都遵循相同的⽣命周期,这样可以让应⽤变得更加可预测且容易理解
什么时候用redux?

  • 多交互,多数据源等场景
  • 某个组件的状态,需要共享
  • 某个组件状态需要在任何地⽅都可以拿到
  • ⼀个组件需要改变全局状态
  • ⼀个组件需要改变另⼀个组件的状态
    Redux之类的状态管 理库充当了⼀个应⽤的业务模型层,并不会受限于如React之类的View层。
    1、redux三大原则
  • 单⼀数据源整个应⽤的state 被储存在⼀棵object tree中,并且这个object tree只存在于唯⼀⼀个 store中。这让同构应⽤开发变得⾮常容易。来⾃服务端的state可以在⽆需编写更多代码的情况下被 序列化并注⼊到客户端中。由于是单⼀的 state tree,调试也变得⾮常容易。在开发中,你可以把应 ⽤的state保存在本地,从⽽加快开发速度。此外,受益于单⼀的state tree ,以前难以实现的如“撤 销/重做”这类功能也变得轻⽽易举。
  • State是只读的唯⼀改变state的⽅法就是触发action,action 是⼀个⽤于描述已发⽣事件的普通对 象。 这样确保了视图和⽹络请求都不能直接修改state,相反它们只能表达想要修改的意图。因为所 有的修改都被集中化处理,且严格按照⼀个接⼀个的顺序执⾏,因此不⽤担⼼竞争条件(race condition)的出现。 action 就是普通对象⽽已,因此它们可以被⽇志打印、序列化、储存、后期调 试或测试时回放出来。
  • 使⽤纯函数来执⾏修改为了描述action 如何改变state tree ,你需要编写reducers。 Reducer只是⼀ 些纯函数,它接收先前的state和action,并返回新的state。reducer主要是为了约束修改行为的,不让随便修改。刚开始你可以只有⼀个reducer,随着 应⽤变⼤,你可以把它拆成多个⼩的reducers,分别独⽴地操作state tree的不同部分,因为reducer 只是函数,你可以控制它们被调⽤的顺序,传⼊附加数据,甚⾄编写可复⽤的reducer来处理⼀些通 ⽤任务,如分⻚器。
    在这里插入图片描述
    redux使用示例:
import {
    createStore } from 'redux';

/**
 * 这是一个 reducer,形式为 (state, action) => state 的纯函数。
 * 描述了 action 如何把 state 转变成下一个 state。
 *
 * state 的形式取决于你,可以是基本类型、数组、对象、
 * 甚至是 Immutable.js 生成的数据结构。惟一的要点是
 * 当 state 变化时需要返回全新的对象,而不是修改传入的参数。
 *
 * 下面例子使用 `switch` 语句和字符串来做判断,但你可以写帮助类(helper)
 * 根据不同的约定(如方法映射)来判断,只要适用你的项目即可。
 */
function counter(state = 0, action) {
   
  switch (action.type) {
   
  case 'INCREMENT':
    return state + 1;
  case 'DECREMENT':
    return state - 1;
  default:
    return state;
  }
}

// 创建 Redux store 来存放应用的状态。
// API 是 { subscribe, dispatch, getState }。
let store = createStore(counter);

// 可以手动订阅更新,也可以事件绑定到视图层。
store.subscribe(() =>
  console.log(store.getState())
);

// 改变内部 state 惟一方法是 dispatch 一个 action。
// action 可以被序列化,用日记记录和储存下来,后期还可以以回放的方式执行
store.dispatch({
    type: 'INCREMENT' });
// 1
store.dispatch({
    type: 'INCREMENT' });
// 2
store.dispatch({
    type: 'DECREMENT' });
// 1

createStore:
Redux主要由三部分组成:store、reducer、action。Redux的核⼼就是 store,它有Redux提供的createStore函数⽣成,该函数返回3个处理函数getState,dispatch,subscribe。

export default function createStore() {
     
  let state = {
   } // 公共状态  
  const getState = () => {
   } // 存储的数据,状态树;  
  const dispatch = () => {
   } // 分发action,并返回⼀个action,这是唯⼀能改变
store中数据的⽅式;  
  const subscribe = () => {
   } //注册⼀个监听者,store发⽣变化的时候被调⽤。  
  return {
   
    dispatch,
    subscribe,
    getState
 }
}

在这里插入图片描述
getState:
getState()实现 对象包含所有数据。如果想得到某个时点的数据,就要对Store⽣成快照。这种时点的数 据集合,就叫做State。

const getState = () => {
       return state; }

dispatch
dispatch()的实现 直接修改state,state.num+‘a’,如修改state像这种情况,就会导致结果不是我们想要 的,后果可能很严重,如果避免呢? 如果可以随意修改state,会造成难以复现的bug ,我们需要实现有条件并且是具名修改的store数据,既然要分发action这⾥要传⼊⼀个action对象,另外这对象包括我们 要修改的state和要操作的具名actionType,这⾥⽤type属性值的不同来对state做相应的修改,代码如
下:

const dispatch = (action) => {
         
   switch (action.type) {
       
     case 'ADD':      
       return {
           
         ...state,        
         num: state.num + 1,      
       }    
     case 'MINUS':      
       return {
           
         ...state,        
         num: state.num - 1,      
       }    
     case 'CHANGE_NUM':      
       return {
           
         ...state,        
         num: state.num + action.val,      
       }     // 没有匹配到的⽅法 就返回默认的值    
     default:      
       return state  
   }  
   }

从代码上看,这⾥并没有把action独⽴出来,接着往下看吧。 函数负责⽣成State。由于整个应⽤只有⼀ 个 State对象,包含所有数据,对于⼤型应⽤来说,这个State必然⼗分庞⼤,导致 Reducer函数也⼗分 庞⼤。
reducer:
reducer是⼀个纯函数,它根据action和initState计算出新的state。
强制使⽤action来描述所有变化带来的好处是可以清晰地知道应⽤中到底发⽣了什么。如果⼀些东⻄改 变了,就可以知道为什么变。最后,为了把action和state串起来,就有了reducer。 reducer.js:

export default function reducer(action, state) {
     
  //通过传进来的 action.type 让管理者去匹配要做的事情  
  switch (action.type) {
       
    case 'ADD':      
      return {
           
        ...state,        
        num: state.num + 1,      
     }    
    case 'MINUS':      
      return {
           
        ...state,        
        num: state.num - 1,      
     }    
    case 'CHANGE_NUM':      
      return {
           
        ...state,        
        num: state.num + action.val,      
     }     // 没有匹配到的⽅法 就返回默认的值    
    default:      
      return state  
 }
 }

action:
Action是把数据从应⽤(译者注:这⾥之所以不叫view是因为这些数据有可能是服务器响应,⽤户输⼊ 或其它⾮view的数据 )传到 store 的有效载荷。它是 store 数据的唯⼀来源。⼀般来说你会通过
store.dispatch() 将 action 传到store。
可以这样理解,Action 描述当前发⽣的事情。改变State 的唯⼀办法,就是使⽤ Action。它会运送数据到 Store

export const ADD = 'ADD'
export const MINUS = 'MINUS'
export const CHANGE_NUM = 'CHANGE_NUM'
/* * Action Creator 来⽣成action */
export function add(

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

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

相关文章

C#拼接JSON

一、业务背景 最近项目需要与U8c对接,实现增删改查,借此机会,梳理一下C#解析Json字符串的问题。 这篇文章,先以新增接口为例。 二、新增接口 查看需要传入的json格式。 拼接json,无非就是{}和[]的来回嵌套。 首先&am…

机器人制作开源方案 | 智能水果分拣机器人

作者:史振鹏 岳欣宇 仲祝伟 单位:邢台学院 指导老师:王承林 魏亚清 一、场景调研 智能水果分拣机器人是基于探索者设计的一款可搬运可分拣以及移动的一款轻便机器人,集成了语音控制、分拣、搬运、识别、抓取等功能,…

Java 序列化机制详解

Java 序列化机制是一种将对象转换为字节流的过程,以便在网络上传输或保存到文件中,并能在需要时将字节流还原为对象。这一机制通过实现 java.io.Serializable 接口来实现,同时涉及到一些关键概念和注意事项。 Serializable 接口 Serializabl…

vscode使用remote ssh到server上 - Node进程吃满CPU

起因:Node进程吃满CPU 分析 我发现每次使用vscode的remote插件登陆到server后,就会出现node进程,不太清楚干什么用的,但是绝对和它有关。 查找原因 首先找到了这篇文章,解决了rg进程的问题: https://blo…

Shell编程基础 – C语言风格的Bash for循环

Shell编程基础 – C语言风格的Bash for循环 Shell Programming Essentials - C Style For Loop in Bash By JacksonML 循环是编程语言的基本概念之一,同样也是Bash编程的核心。当用户需要一遍又一遍地运行一系列命令直到达到特定条件时,例如&#xff1…

知识蒸馏:channel wise知识蒸馏CWD

论文:https://arxiv.org/pdf/2011.13256.pdf 1. 摘要 知识蒸馏用于训练紧凑型(轻量)模型被证明是一种简单、高效的方法, 轻量的学生网络通过教师网络的知识迁移来实现监督学习。大部分的KD方法都是通过algin学生网络和教师网络的归一化的feature map, 最小化feature map上的…

数据结构--图

树具有灵活性,并且存在许多不同的树的应用,但是就树本身而言有一定的局限性,树只能表示层次关系,比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中,数据元素之间的关系是任意的。 一、图…

内网安全—Windows系统内核溢出漏洞提权

系统内核溢出漏洞提权 往缓冲区中写入超出限定长度的内容,造成缓冲区溢出,从而破坏程序的堆栈进而运行自己精心准备的指定代码,达到攻击的目的。 分类: 堆溢出 栈溢出 查找补丁的方法 1、手工查找补丁情况 systeminfo Wmic qfe…

Redis设计与实现之Lua 脚本

目录 一、 Lua 脚本 1、初始化 Lua 环境 2、脚本的安全性 3、脚本的执行 4、 EVAL 命令的实现 定义 Lua 函数 执行 Lua 函数 5、 EVALSHA 命令的实现 二、 小结 一、 Lua 脚本 Lua 脚本功能是 Reids 2.6 版本的最大亮点,通过内嵌对 Lua 环境的支持&#xf…

加特兰Demo点迹数据Python读取和显示

加特兰当前主推的芯片,拿到了样件做了几个基本Demo测试,录取的点迹数据为txt文档,数据格式如下: FT 0.10 CMN1 263 CMN2 150 BNK 0 --- F 0 O 140/2/140!0/0/0/0/0/0.00! --- BK00: P 25.67, R 4.11, V 0.00, A -39.04,…

AR室内导航如何实现?技术与原理分析

随着科技的进步,我们生活中许多方面正在被重新定义。其中之一就是导航,尤其是室内导航。增强现实(AR)技术的出现为室内导航带来了革命性的变革。本文将深入探讨AR室内导航的技术与原理,以及它如何改变我们的生活方式。…

bat批处理:git上传更新

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 批处理背景批处理代码代码说明:使…

Hadoop Single Node Cluster的安装

Hadoop Single Node Cluster的安装 安装JDK查看java -version更新本地软件包安装JDK查看java安装位置 设置SSH无密码登录安装hadoop下载安装设置hadoop环境变量修改hadoop配置设置文件设置core-site.xml设置YARN-site.xml设置mapred-site.xml设置HDFS分布式文件系统创建并格式化…

[ CTF ]【天格】战队WriteUp-第七届“强网杯”全国安全挑战赛

第七届“强网杯”全国安全挑战赛 2023.12.16~2023.12.17 文章目录 【Misc】Pyjail ! Its myFILTER !!!easyfuzz谍影重重2.0签到Pyjail ! Its myRevenge !!!server_8F6C72124774022B.py 问卷调查 【Reverse】ezre 【Web】happygame 【强网先锋】石头剪刀布TrieSpeedUpezreez_fmt…

翻译: LLMs新的工作流程和新的机会 New workflows and new opportunities

生成人工智能正以多种方式引领着不仅仅是成本节约,更是收入增长。但是,就像生成人工智能这样的通用技术创造价值的方式有很多,谈论这些方式是很多的。但在这个视频中,我想看看一些我看到的新兴的,或者更常见的走向这种…

Java 8 中的 Stream:优雅的集合处理

Java 8 中的 Stream:优雅的集合处理 为什么需要 Stream?Stream 的特性Stream 基本操作1. 创建 Stream2. 中间操作2.1 过滤(Filter)2.2 映射(Map)2.3 截断(Limit) 3. 终端操作3.1 遍历…

STM32内部是怎么工作的

STM32是怎么工作的 1 从孩子他妈说起2 早期计算机的组成2.1 五大元件(1)第一个出场的是电容元件(2)第二个出场的是二极管(3)第三个出场的是电阻元件(4)第四个出场的是电感&#xff0…

其他配置相关安装

consul安装和配置 docker run -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600/udp consul consul agent -dev -client0.0.0.0访问:http://192.168.0.102:8500/ DNS查询 dig 192.168.0.102 -p 8600 consul.service.consul SRVnacos安装 ht…

华为OS与麒麟OS:华为自研操作系统的对决

导言 在移动操作系统领域,华为OS和麒麟OS代表了华为在自主研发方面的努力。本文将深入探讨这两个操作系统的特点、竞争关系以及它们在用户体验、生态系统建设等方面的差异。 1. 背景与起源 华为OS的诞生: 华为OS是华为公司为应对外部环境而自主…

12.18_黑马数据结构与算法笔记Java

目录 thinking:orElse? thinking:map.computerifabsent? thinking:subString? 184 哈希表 问2 解释拆分 185 哈希算法 概述 186 哈希算法 Object.hashCode 187 哈希算法 String.hashCode 188 哈希算法 冲突测试 189 哈希算法 MurmurHash 190…