现代前端架构介绍(第三部分):深入了解状态管理层及其对前端App的影响
远离JavaScript疲劳和框架大战,了解真正重要的东西
在第二部分中,我们讨论了功能架构的三个层次。其中一个就是状态管理层,今天我们将对其进行更深入的探讨。下面是现代前端架构系列的第三部分和最后一部分介绍。
状态管理,你可能看不到它,但它确实存在…
我们假设有一个购物应用,其中包含一系列产品列表。当用户选择一个产品时,其详细信息(价格、产地等)将被显示。对于大多数用户来说,这可能只是单击一个按钮的动作,但对于前端开发人员来说,应用的状态已经发生了变化。这意味着什么呢?
让我们一步步回顾一下事情的经过:
- 用户执行了点击操作来选择产品。
- 该应用程序通过获取产品详细信息来响应该事件。
- 用户界面被更新以反映产品详细信息的新价值。
因此,每当发生事件时,该应用程序会更新其值并显示变化。
那么什么是状态?
在任何给定的时间点上,应用程序所持有的属性或变量的值。(来源:Quora)
那么什么是状态管理呢?
在应用程序中添加、更新、删除和读取状态的概念
好的,它如何影响前端架构?
前端应用程序被设想为执行功能并向用户界面(UI)发送事件,以将当前状态更改为另一种状态。
组件与状态交互
为了正确地渲染组件,通常需要提供输入,这些输入通常由状态提供。这意味着状态的任何变化都会更新输入,因此应该触发变化检测以刷新视图。
所以问题在于,如何改变状态呢?
我们通过探索 Redux 模式(目前是前端状态管理的事实上的标准)来回答这个问题。
当应用程序中发生事件(点击、拖动、HTTP调用等)时,它会被转换为一个动作,并被分发到状态管理领域。到达后,它将由称为“还原器”的函数处理。还原器是纯函数,负责使用传入的操作和当前状态创建新的状态。新的状态将替换当前状态,并且组件的输入将根据新的值进行更新。
在回家的
纯函数意味着对于相同的输入,它总是会返回相同的输出。这使得副作用(可能会导致结果不可预测)没有存在的空间。例如,两个值的总和总是相同的(1+1=2),但是由于各种原因(网络问题、无效请求、授权问题等),同一个网络请求的结果可能成功也可能不成功。
那么如何在 Redux 中处理副作用呢?
深入学习 Redux
与前面描述的完全相同,只是触发任务产生副作用的操作不会被还原器处理,而是由 Redux 的另一个部分处理。副作用处理程序执行不纯任务,然后将结果作为没有副作用的 action 重新引入。例如,当“获取产品详细信息” action 被发送时,副作用块将发出一个 HTTP 请求以获取结果。一旦请求完成(成功或失败),一个新的 action 将描述最终结果(Fetch product details success 或 Fetch product details failed),并发送给还原器。
状态管理模块在 Redux 中被称为 Store。它负责分发动作、包含 reducer 并存储当前状态。Redux 模式强制执行单向数据流,使 App 具有可预测性和一致性。只有通过动作,App 的状态才能发生变化,而这种变化将在 UI 中得到反映。
这些变化会如何影响我们的代码结构呢?
<span style="background-color:#f2f2f2"><span style="color:#242424">AppRepo│ ├──/Overview <strong>|</strong> ├──/Components <strong>|</strong> ├──/ListComponent │ └──/ChartComponent <strong>|</strong> ├──/State<strong>|</strong> ├──overview.state.ts * our feature state file<strong>|</strong> ├──overview.actions.ts * our feature actions file<strong>|</strong> ├──overview.reducers.ts * our feature reducers file</span></span>
与对组件所采取的相同方法一样,我们决定创建一个文件夹来存放属于状态管理层的每个元素:
- 特点。状态:特征状态的定义
- 特点。动作:属于业务领域特征的操作
- 特点。归约器:具有必要逻辑以更新特征状态的功能
解释软件架构并不是一件容易的事。
我尝试采用一种“由外而内(自上而下)”的方法,在第一部分《App是如何由不同的构建块构成的》一文中,我详细介绍了现代前端架构中的App是如何由不同的构建块构成的。随后,在第二部分《如何将功能架构分为三层》一文中,我指出现代前端架构中的功能架构是如何被分为三个由关注点分离的层的。最后,我在第三部分《深入了解状态管理层及其对前端App的影响》一文中,探讨了状态管理层的内部结构及其对前端App的影响。
在前端架构方面,比如单体仓库、微前端架构或者如何让功能域保持良好的分离但又易于理解,仍然存在更多的挑战。但在我看来,这一切都始于理解前端应用程序的性质及其需求。
欢迎关注公众号:清晰编程,获取更多精彩内容
相关文章:

现代前端架构介绍(第三部分):深入了解状态管理层及其对前端App的影响
远离JavaScript疲劳和框架大战,了解真正重要的东西 在第二部分中,我们讨论了功能架构的三个层次。其中一个就是状态管理层,今天我们将对其进行更深入的探讨。下面是现代前端架构系列的第三部分和最后一部分介绍。 状态管理,你可能…...

NLP与搜广推常见面试问题
1 auc指标 AUC的两种意义 一个是ROC曲线的面积另外一个是统计意义。从统计学角度理解,AUC等于随机挑选一个正样本和负样本时,模型对正样本的预测分数大于负样本的预测分数的概率。下图为搜广推场景下的一个计算auc的例子 2 GAUC指标 就是在推荐系统…...
Python怎么实现协程并发呢?
在Python中,实现协程并发主要是通过asyncio库来完成的。asyncio是Python 3.4中引入的标准库,用于编写单线程的并发代码。使用async和await关键字,你可以定义协程和等待其他协程的完成,而不需要创建额外的线程或进程。 下面是一个使…...

专治408开始的晚!8月一定要完成这些事!
八月份才开始408,那到考试最多也只有4-5个月的时间 别担心,可以复习两轮! 其实我一直建议大家408复习三轮,但是如果时间不够,那就要在复习质量上下功夫! 考408有一个好处,就是不用先确定学校…...

计算机毕业设计选题推荐-校内跑腿业务系统-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
Unity命名验证工具类
在Unity开发中,经常需要验证变量名是否符合命名规范,同时避免使用C#的保留字作为变量名。本教程将演示如何创建一个简单的工具类来实现这一功能。 步骤 1:创建Unity命名验证工具类 首先,我们创建一个C#类,命名为Unit…...

基于cubeMX的STM32开启SPI及DMA
1、打开cubeMX后,设置SPI,如下图 2、设置SPI的DMA中断 3、DMA设置 4、SPI的GPIO设置 5、最后生成代码,可以看到工程文件中有dma.c和spi.c 6、使用举例:如幻彩灯的亮灭使用SPIDMA产生的信号波形来控制,在ws2812.c中调用…...

AI大模型技术的四大核心架构分析
AI大模型技术的四大核心架构演进之路 随着人工智能技术的飞速发展,大模型技术已经成为AI领域的重要分支。 深度剖析四大大模型技术架构:纯粹的Prompt提示词法、Agent Function Calling机制,RAG(检索增强生成)及Fine-…...

[C#]调用本地摄像头录制视频并保存
AForge.NET是一个基于C#框架设计的开源计算机视觉和人工智能库,专为开发者和研究者设计。它提供了丰富的图像处理和视频处理算法、机器学习和神经网络模型,具有高效、易用、稳定等特点。AForge库由多个组件模块组成,包括AForge.Imaging&#…...

opencv-图像基础变换
1,缩放 缩放是对图像的大小进行调整 缩放矩阵,相当于x和y乘一个常数 例如将图像放大两倍 import cv2 img cv2.imread(1.jpg) img cv2.resize(img, (400,400)) img cv2.resize(img, (0,0), fx3, fy1)#表示x方向扩大三倍,y方向不变 2&…...

xss漏洞(三,xss进阶利用)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 1,本文基于dvwa靶场以及PHP study进行操作,靶场具体搭建参考上一篇: xss漏洞(二,xss靶场搭建以及简单…...

git 迁移仓库的方法
git Git是一个开源的分布式版本控制系统,由Linus Torvalds在2005年创建,用于有效、高速地处理从小到大的项目管理。它最初是为Linux内核开发而设计的,但很快被广泛用于各种项目。 以下是Git的一些主要特性: 分布式架构ÿ…...
C# Where关键字
1. 泛型约束(Generic Constraints) 在泛型类、接口或方法的定义中,where关键字用于指定类型参数的约束。这些约束可以确保类型参数具有某些特定的属性。例如它是一个类、实现了某个接口、是另一个类型的派生类、具有无参构造函数等。 1.1 …...

《计算机组成原理》(第3版)第1章 计算机系统概论 复习笔记
第1章 计算机系统概论 一、计算机系统简介 (一)计算机的软硬件概念 1.计算机系统由“硬件”和“软件”两大部分组成 (1)所谓“硬件”,是指计算机的实体部分,如主机、外部设备等。 ࿰…...

达梦数据库的系统视图v$cachers
达梦数据库的系统视图v$cachers 达梦数据库的系统视图V$CACHERS的作用是显示缓存中的项信息,在 ini 参数 USE_PLN_POOL !0 时才统计。这个视图帮助数据库管理员监控和分析缓存的使用情况,优化数据库性能。通过查询V$CACHERS视图,可以获取缓存…...
电路元件基本知识详解
电路元件基本知识详解 在现代电子技术中,电路元件是构成各种电子电路的基本单元。它们各自具有不同的特性和功能,通过不同的连接方式实现多种多样的电路功能。本文将详细介绍几种常见的电路元件及其基本知识。 ### 一、电阻器 #### 1. 电阻器的基本概…...
从零开始写一个微信小程序
从零开始写一个微信小程序可以分为几个步骤。以下是一个详细的指南,帮助你从头到尾完成一个简单的微信小程序。 ### 一、准备工作 1. **注册微信小程序账号**: - 前往[微信公众平台](https://mp.weixin.qq.com/)注册一个小程序账号。 - 进行企业认证(个人账号需要申…...

07030405复杂可编程逻辑器件CPLD现场可编程阵列FPGA
复杂可编程逻辑器件CPLD&现场可编程阵列FPGA 7.3 复杂可编程逻辑器件CPLD7.3.1CPLD的结构 7.4现场可编程门阵列FPGA7.4.1FPGA实现逻辑功能的基本原理7.4.2FPGA结构简介1.可编程逻辑块2.I/O块3.可编程连线资源CPLD与FPGA的区别 7.5可编程逻辑器件开发过程简介编程条件 7.3 复…...
《雅思口语真经总纲1.0》话题实战训练笔记part1——5. Bus or taxi
《雅思口语真经总纲1.0》笔记——第四章:口语素材大全(part1、part2、part3回答准则及练习方法,不包括范例答案)★★★★★ 文章目录 Bus or taxiHou often do you take the bus?20240803答评价疑问 When was the first time you…...

《工程检索增强生成系统时的七个失败点》论文 AI 解读
周末使用 AI 速度了一篇 RAG 相关的论文,文中提到的【设计 RAG 系统时需要考虑的七个失败点】非常有价值,简单整理一下分享出来,大家如果感兴趣可以继续阅读原文。 论文名称:Seven Failure Points When Engineering a Retrieval A…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...