Redux 作为 JavaScript 应用的状态管理库,其技术架构与核心原理围绕​​可预测的状态管理​​设计,通过严格的单向数据流和函数式编程理念实现复杂应用的状态控制。以下从设计理念、核心架构、工作流程、源码实现等角度进行系统性剖析:


一、设计理念与原则

  1. ​单一数据源(Single Source of Truth)​
    • 整个应用的状态存储在一个全局 Store 对象中,形成唯一的状态树(State Tree)。
    • ​优势​​:简化状态共享和调试,避免分布式状态导致的逻辑混乱。
  2. ​状态只读(State is Read-Only)​
    • 状态不可直接修改,唯一修改方式是 ​dispatch(action)​。Action 是描述状态变化的普通对象,需包含 type 属性(如 { type: 'ADD_TODO', text: 'Learn Redux' })。
    • ​目的​​:确保状态变更可追踪,避免隐蔽的副作用。
  3. ​纯函数更新(Changes via Pure Functions)​
    • Reducer 是纯函数,接收旧状态和 Action,返回​​新状态​​(而非修改旧状态)。
    • ​关键约束​​:
      • ​无副作用​​:不修改输入参数、不调用非纯函数(如 Date.now())、不执行异步操作。
      • ​幂等性​​:相同输入必得相同输出。

二、核心架构解析

1. ​​Store:状态容器​
  • 职责:
    • getState():获取当前状态。
    • dispatch(action):触发状态更新。
    • subscribe(listener):订阅状态变更事件。
  • ​实现关键​​:闭包管理状态(currentState)和监听器数组(currentListeners)。
2. ​​Action:状态变更的描述​
  • 本质:包含 type 的 JS 对象,可携带额外数据(如 payload)。
  • ​Action Creator​​:封装创建 Action 的逻辑,提高代码复用性。
3. ​​Reducer:状态变更的执行者​
  • 函数签名:(state, action) => newState

  • ​不可变更新​​:必须返回新对象(而非修改原状态)。

    // 错误:直接修改原状态
    state.todos.push(action.payload);  
    // 正确:返回新对象
    return { ...state, todos: [...state.todos, action.payload] };  
    
  • ​组合性​​:通过 combineReducers 拆分多个子 Reducer,分别管理状态树的不同部分。

4. ​​Middleware:扩展 Dispatch 能力​
  • ​拦截 Action​​:在 Action 到达 Reducer 前执行额外逻辑(如异步请求、日志记录)。

  • ​中间件链​​:通过函数嵌套实现(如 applyMiddleware(thunk, logger))。

    const thunkMiddleware = ({ dispatch }) => next => action => {if (typeof action === 'function') { return action(dispatch); // 处理函数型 Action(如 redux-thunk)}return next(action); // 传递普通 Action
    };
    

三、工作流程详解

Redux 的数据流是严格的单向循环:

  1. ​触发 Action​​:用户操作(如点击)调用 dispatch(action)
  2. ​执行 Reducer​​:Store 调用 Reducer,传入当前状态和 Action,生成新状态。
  3. ​更新 Store​​:新状态替换旧状态。
  4. ​通知订阅者​​:执行所有通过 subscribe() 注册的监听器(如触发 React 组件重渲染)。
  5. ​视图更新​​:组件通过 getState() 获取新状态并更新 UI。

四、源码核心实现

1. ​createStore​:核心工厂函数
function createStore(reducer, preloadState) {let currentState = preloadState; // 闭包保存状态let listeners = [];const getState = () => currentState;const subscribe = (listener) => {listeners.push(listener);return () => listeners.splice(listeners.indexOf(listener), 1); // 取消订阅};const dispatch = (action) => {// 校验 Action 为纯对象if (Object.getPrototypeOf(action) !== Object.prototype) throw new Error('Action 必须是纯对象');currentState = reducer(currentState, action); // 调用 Reducerlisteners.forEach(listener => listener()); // 通知订阅者};dispatch({ type: '@@redux/INIT' }); // 初始化状态return { dispatch, subscribe, getState };
}
2. ​combineReducers​:合并多个 Reducer
export default function combineReducers(reducers) {const reducerKeys = Object.keys(reducers);return function combination(state = {}, action) {const nextState = {};reducerKeys.forEach(key => {const reducer = reducers[key];const prevStateForKey = state[key];nextState[key] = reducer(prevStateForKey, action); // 每个子 Reducer 独立更新});return nextState;};
}
3. ​bindActionCreators​:自动绑定 Dispatch
function bindActionCreator(actionCreator, dispatch) {return (...args) => dispatch(actionCreator(...args)); // 自动派发 Action
}

五、设计哲学与工程价值

  1. ​可预测性​​:
    • 状态变更由纯函数(Reducer)驱动,避免隐蔽的副作用。
    • Action 日志 + 时间旅行调试(如 Redux DevTools)。
  2. ​解耦与复用​​:
    • 组件无需关心状态来源,只需订阅 Store 或通过 connect(React-Redux)注入状态。
    • Reducer 可复用、可组合,适合模块化开发。
  3. ​异步扩展​​:
    • 中间件机制支持 redux-thunk(函数型 Action)、redux-saga(生成器流程控制)等方案,分离副作用与核心逻辑。

六、适用场景与局限性

  • ​适用​​:
    • 多组件共享复杂状态(如用户登录态、全局配置)。
    • 需要记录/回放状态变更(如撤销重做)。
  • ​不适用​​:
    • 简单应用(引入 Redux 反而增加模板代码)。

Redux 通过 ​​Store 集中管理状态​​、​​Action 描述变更意图​​、​​Reducer 纯函数更新状态​​的三元架构,实现状态的可预测管理。其核心价值在于​​严格的单向数据流​​和​​函数式编程约束​​,为复杂应用提供可维护、可扩展的状态管理方案。

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

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

相关文章

linux制作镜像、压缩镜像、烧录的方法

最近在玩香橙派的时候,需要搞多个板子,一个一个配环境也太麻烦了吧......于是通过搜索,发现可以把linux设备(比如香橙派,树莓派等等)制作为镜像,然后像烧录官方镜像一样烧进新的sd卡&#xff0c…

机械材料计算软件,快速核算重量

软件介绍 今天为大家推荐一款专为机械行业设计人员打造的金属材料重量计算软件,帮助工程师快速完成材料重量核算。 软件特点 这款绿色版计算工具体积小巧,不足100KB,无需安装即可直接运行,不占用系统资源,特别适…

Chrome更新后,扩展不能用问题

Chrome更新后,扩展不能用问题 此扩展程序不再受支持,因此已停用 在 Windows 10/11 搜索框中输入 regedit 打开 注册表编辑器 在注册表编辑器中打开:HKEYLOCALMACHINE\SOFTWARE\Policies\ 右键单击 Policies 新建项 命名为 Google 右键单…

【Python】通过cmd的shell命令获取局域网内所有IP、MAC地址,通过主机名获取IP

【Python】通过cmd的shell命令获取局域网内所有IP、MAC地址,通过主机名获取IP 更新以gitee为准: gitee 文章目录cmd命令获取IPping主机名获取IP的主机名socket获取当前网关运行效果附录:列表的赋值类型和py打包列表赋值BUG复现代码改进优化总…

sky-take-out项目Mybatis的使用

分页查询public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) {PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize());//下一条sql进行分页&#xff0c;自动加入limit关键字分页Page<Category> page categor…

H3CNE小小综合实验

实验拓扑图实验需求 按照图示配置IP地址在SW1和SW2之间配置链路聚合增加链路带宽&#xff0c;提高可靠性PC5和PC6属于VLAN10&#xff0c; PC7和PC8属于VLAN20SW1和SW2属于二层交换机&#xff0c;SW3为三层交换机&#xff08;VLAN100用于对接R4&#xff09;,在交换机之间相连的链…

IP协议深入理解

一、什么是ip协议?1.1、ip协议是网络层协议&#xff0c;ip协议的本质工作是提供一种能力&#xff0c;把数据可靠的跨网络从主机A送到主机B&#xff1b;1.2、什么是ip&#xff1f;ip目标网络目标主机&#xff1b;画图图解:如图&#xff0c;当主机A想要把数据发给主机B时&#x…

接收表单数据:serialize()函数解析

一、form-serialize作用与引入 作用&#xff1a; form-serialize可以快速收集表单数据&#xff0c;按照使用者意愿转化为对象或字符串输出&#xff0c;以便于提交至服务器。 引入&#xff1a; form-serialize不是浏览器自带的JS方法&#xff0c;而是第三方工具库。可以直接通过…

vc配置使用预编译

预编译原理 stdafx.h中加入系统文件&#xff0c;减少cpp中对这些文件的解析&#xff0c;提高速度 stdafx.h 会把编译的文件生成pch&#xff0c;后续解析头文件直接调用pch里面的数据 配置 新建stdafx.h和stdafx.cpp文件 配置stdafx.cpp文件为/Yc 创建预编译文件整个项目设置/Yc…

反射机制的登录系统

一、实体层&#xff08;po层&#xff09; //UserInfo package com.hugeyurt.po;import java.sql.ResultSet; import java.sql.SQLException;public class UserInfo {private String userID;private String name;private int count;private Long errorTime;private String pwd;p…

装饰器模式及优化

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种模式创建了一个装饰器类&#xff0c;用来包装原有的类&#xff0c;并在保持类方法签名完整性的前提下&#xff…

共指消解技术全解析:从语言学规则到深度学习(附论文精读)

精读威斯康星大学综述《Coreference Resolution: A Survey》&#xff0c;揭秘NLP中"实体链接"的核心技术一、什么是共指消解&#xff1f;为什么它是NLP的基石&#xff1f;共指消解(Coreference Resolution) 旨在识别文本中指向同一实体的不同表述。例如&#xff1a;t…

git配置git commit -m “fix 11,22: 修改bugid为11,22“

文章目录前言一、报错提示二、实现1.commitlint.config.js规范配置2. **修改正则表达式**&#xff1a;3. **移除 scope-case 规则**&#xff1a;4. **增强自定义规则逻辑**&#xff1a;测试结果&#xff1a;正则表达式详解&#xff1a;前言 提示&#xff1a;正常的配置git规范…

nastools继任者?极空间部署影视自动化订阅系统『MediaMaster』

nastools继任者&#xff1f;极空间部署影视自动化订阅系统『MediaMaster』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于我们NAS玩家来说&#xff0c;观影总是大家绕不开的一个执念&#xff0c;并且为观影的折腾大家也都是乐此不疲~ 曾经有一个非常绝绝子的观影神器摆在我们…

题解:CF1690G Count the Trains

思路&#xff1a; 首先我们可以理清一下各种情况&#xff1a;1&#xff09;m可能为02&#xff09;一次操作时&#xff0c;只需要考虑每节火车的车头。3&#xff09;当一节火车的速度降低时&#xff0c;只会影响它及它后面的车厢当m0时&#xff0c;我们可以记录上一节车头的速度…

CCF编程能力等级认证GESP—C++3级—20250628

CCF编程能力等级认证GESP—C3级—20250628单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)奇偶校验分糖果单选题&#xff08;每题 2 分&#xff0c;共 30 分…

2G和3G网络关闭/退网状态(截止2025年7月)

从能打语音电话的2G&#xff0c;到能发彩信、聊QQ的3G&#xff0c;这两项陪伴了我们数十年的通信技术&#xff0c;正在悄然退出历史舞台。近日&#xff0c;全球移动供应商协会&#xff08;GSA&#xff09;发布的《2025年7月2G和3G网络关闭报告》显示&#xff0c;全球已有超百个…

Day06_C语言网络编程20250718mobus重点

01.思维导图1 什么是 modbus他是一个在工控领域非常好用的通信写 modbus协议本质上是一个 基于 tcp 协议二次封装的一个协议 什么叫做基于tcp二次封装的协议&#xff1a;我们自己写的pack_t(无论静态还是动态)&#xff0c;都是属于二次封装的协议modbus协议是一种 “主从问答式…

比亚迪古德伍德亮相:从技术突破到文化对话

近日&#xff0c;比亚迪携腾势Z9GT、方程豹豹5、腾势D9亮相英国古德伍德速度节——全球最具声望的汽车文化盛典。方程豹豹5搭载全球首个 DMO电驱越野平台&#xff0c;在爬山赛道上展现出媲美性能跑车的动力响应与精准控制&#xff0c;彻底打破“越野必靠大排量燃油机”的西方传…

UniApp TabBar 用户头像方案:绕过原生限制的实践

需求场景&#xff1a; 在 UniApp 项目中&#xff0c;需要将 TabBar 首页项 (index) 的图标替换为当前用户的网络图片&#xff0c;并实现&#xff1a; 放大且圆形显示。点击该图标时&#xff0c;页面滚动回顶部。切换到其他分类时&#xff0c;首页 Tab 项恢复为普通首页图标。 尝…