React 第三十一章 前端框架的分类

news2024/11/15 11:46:16

现代前端框架,有一个非常重要的特点,那就是基于状态的声明式渲染。如果要概括的话,可以使用一个公式:

UI = f(state)

  • state:当前视图的一个状态
  • f:框架内部的一个运行机制
  • UI:宿主环境的视图描述

这里和初中的一个数学代数知识非常相似:

2x + 1 = y

x 的变化会导致 y 的变化,x 就被称之为自变量,y 就被称之为因变量。

自变量

类比上面 UI 的公式,state 就是自变量,state 的变化会导致最终计算出来的 UI 发生变化,UI 在这里就是因变量。

目前在 React 中有很多 Hook,例如:

const [x, setX] = useState(0);

比如上面的代码,我们就是定义了一个自变量

function App(){
  const [x, setX] = useState(0);
  return <div onClick={()=>setX(x+1)}>{x}</div>
}

上面的 useState 这个 hook 可以看作是定义了一个自变量,自变量一变化,就会到导致依赖它的因变量发生变化,在上面的例子中,返回的 jsx 所描述的 UI 就是因变量。

因变量

因变量可以分为两类:

  • 没有副作用的因变量
  • 有副作用的因变量

没有副作用的因变量

在 React 中,useMemo 就是定义一个没有副作用的因变量

const y = useMemo(() => x * 2 + 1, [x]);

在上面的代码中,我们使用 useMemo 定义了一个没有副作用的因变量 y,y 的值取决于 x 的值,x 的值一变化,y 的值也会跟着变化

有副作用的因变量

在 React 中,可以使用 useEffect 来定义一个有副作用的因变量

useEffect(() => document.title = x, [x]);

上面的代码依赖于自变量 x 的变化,当 x 发生变化的时候,会修改页面的标题,这就是一个副作用操作。

总结

自变量的变化,会导致以下三种情况的因变量发生改变:

  • 自变量的变化,导致 UI 因变量变化
function Counter(){
  const [num, setNum] = useState(0);
  return (
    <div onClick={()=>setNum(num+1)}>{num}</div>
  );
}
  • 自变量的变化,导致无副作用的因变量发生变化
function Counter(){
  const [num, setNum] = useState(0);
  const fiexedNum = useMemo(()=>num.toFiexed(2), [num]);
  return (
    <div onClick={()=>setNum(num+1)}>{fiexedNum}</div>
  );
}
  • 自变量的变化,导致有副作用的因变量发生变化
function Counter(){
  const [num, setNum] = useState(0);
  useEffect(()=>document.title=num, [num]);
  return (
    <div onClick={()=>setNum(num+1)}>{num}</div>
  );
}

框架的分类

上面我们介绍了自变量和因变量,state 实际上就是自变量,自变量的变化直接或者间接的改变了 UI,上面的公式实际上还可以分为两个步骤:

  • 步骤一:根据自变量 state 计算出 UI 的变化
  • 步骤二:根据 UI 的变化执行具体的宿主环境的 API

以前端工程师最熟悉的浏览器为例,那么第二个步骤就是执行 DOM 相关 API。对于步骤二来讲,不同的框架实际上实现基本是相同的,这个步骤不能作为框架分类的依据,差别主要体现在步骤一上面,步骤一也是针对目前各大框架的一个分类的依据。

应用的示例

该应用由三个组件组成

image-20230222161811030

A 组件是整个应用的根组件,在这个根组件中,有一个自变量 a,a 的变化会导致 UI 的重新渲染。

image-20230222162329389

上图表示在 A 组件中引入了一个因变量 b,A 组件中的自变量 a 的改变会导致因变量 b 的改变,而这个因变量 b 又作为 props 传递到了子组件 B 当中。

B 组件中也有一个自变量 c,在该组件中还接收从父组件 A 传递过来的 props b,最终在 UI 中渲染 b + c

image-20230222163203653

在组件 C 中,接收从根组件 A 传递过来的数据 a,从而 a 变成 C 组件的一个自变量。

接下来我们来总结一下,各个组件中所包含的自变量:

  • A 组件
    • 自变量 a
    • a 的因变量 b
  • B 组件
    • 从 A 组件传递过来的自变量 b
    • 自变量 c
  • C 组件
    • 从 A 组件传递过来的自变量 a

理清楚自变量之后,我们就可以从三个维度去整理自变量和不同维度之间的关系。

  • 自变量与 UI 的对应关系

    从 UI 层面去考虑的话,自变量的变化会导致哪些 UI 发生变化?

    • a 变化导致 A 的 UI 中的 {a} 变化
    • a 变化导致因变量 b 变化,导致 B 的 UI 中的 {b+c} 变化
    • a 变换导致 C 的 UI 中的 {a} 变化
    • a 变化导致 C 的 UI 中的 {a.toFixed(2)} 变化
    • c 变化导致 B 的 UI 中的 {b+c} 变化

    总共我们梳理出来的 UI 变化路径有 5 条,接下来我们要做的事情就是根据梳理出来的变化路径执行具体的 DOM 操作即可。

  • 自变量与组件的对应关系

    从组件的层面去考虑的话,自变量的变化会导致哪些组件发生变化呢?

    • a 变化导致 A 组件 UI 变化
    • a 变化导致 b 变化,从而导致 B 组件的UI 变化
    • a 变化导致组件 C 的UI 变化
    • c 变化导致组件 B 的 UI 变化

    相较于上面的自变量与 UI 的对应关系,当我们考虑自变量与组件之间的关系时,梳理出来的路径从 5 条变成了 4 条。虽然路径减少了,但是在运行的时候,需要进行额外的操作,就是确定某一个组件发生变化时,组件内部的 UI 需要发生变化的部分。例如,通过路径 4 只能明确 B 组件发生了变化,但是具体发生了什么变化,还需要组件内部进行进一步的确定。

  • 自变量与应用的对应关系

    最后我们考虑自变量和应用之间的关系,那么路径就变成了:

    • a 变化导致应用中发生 UI 变化
    • c 变化导致应用中发生 UI 变化

    整体路径从 4 条减少为了 2 条,虽然路径减少了,但是要做的额外的工作更多了。比如 a 的变化会导致应用中的 UI 发生变化,那么究竟是哪一部分的 UI ?这些需要额外的进行确定。

最后我们可以总结,前端框架需要关注自变量和 因变量(UI、组件、应用) 的对应关系。随着 因变量 的抽象层级不断下降,自变量到 UI 变化的路径条数就会增多。路径越多,则意味着前端框架在运行时消耗在“寻找自变量与 UI 对应关系”上面的时间越少。

根据上面的特点,我们就可以针对现代前端框架分为三大类:

  • 元素级框架
  • 组件级框架
  • 应用级框架

以常见的前端框架为例,React 属于应用级框架,Vue 属于组件级的框架,而新的 Svelte、Solid.js 属于元素级框架。

真题解答

题目:现代前端框架不仅仅是 React、Vue,还出现了像 Svelte、Solid.js 之类的框架,你觉得这些新框架相比 React、Vue 有什么样的区别?

参考答案:

所有的现代前端框架,都有一个非常重要的特点,那就是“基于状态的声明式渲染”。概括成一个公式的话,那就是 UI = f(state)

这里有一点类似于初中数学中自变量与因变量之间的关系。例如在上面的公式中,state 就是一个自变量,state 的变化会导致 UI 这个因变量发生变化。

不同的框架,在根据自变量(state)的变化计算出 UI 的变化这一步骤有所区别。自变量和 因变量(应用、组件、UI)的对应关系,随着 因变量 抽象的层级不断下降,“自变量到 UI 变化”的路径则不断增多。路径越多,则意味着前端框架在运行时消耗在寻找“自变量与 UI 的对应关系”上的时间越少。

以“与自变量建立对应关系的抽象层级”可以作为其分类的依据,按照这个标准,前端框架可以分为以下三类:

  • 元素级框架
  • 组件级框架
  • 应用级框架

以常见的前端框架为例,React 属于应用级框架,Vue 属于组件级框架,Svelte、Solid.js 属于元素级框架。

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

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

相关文章

计算机视觉——基于改进UNet图像增强算法实现

1. 引言 在低光照条件下进行成像非常具有挑战性&#xff0c;因为光子计数低且存在噪声。高ISO可以用来增加亮度&#xff0c;但它也会放大噪声。后处理&#xff0c;如缩放或直方图拉伸可以应用&#xff0c;但这并不能解决由于光子计数低导致的低信噪比&#xff08;SNR&#xff…

从头理解transformer,注意力机制(下)

交叉注意力 交叉注意力里面q和KV生成的数据不一样 自注意力机制就是闷头自学 解码器里面的每一层都会拿着编码器结果进行参考&#xff0c;然后比较相互之间的差异。每做一次注意力计算都需要校准一次 编码器和解码器是可以并行进行训练的 训练过程 好久不见输入到编码器&…

【图论 回溯 广度优先搜索】126. 单词接龙 II

本文涉及知识点 图论 回溯 深度优先搜索 广度优先搜索 图论知识汇总 LeetCode 126. 单词接龙 II 按字典 wordList 完成从单词 beginWord 到单词 endWord 转化&#xff0c;一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> … -> sk 这样的单词序…

机器学习入门到放弃2:朴素贝叶斯

1. 算法介绍 1.1 算法定义 朴素贝叶斯分类&#xff08;NBC&#xff09;是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法&#xff0c;先通过已给定的训练集&#xff0c;以特征词之间独立作为前提假设&#xff0c;学习从输入到输出的联合概率分布&#xff0c;再基于学习…

oracle 数据库与服务、实例与SID、表空间、用户与表模式

一、数据库与数据库服务: 概念:就是一个数据库的标识,在安装时就要想好,以后一般不修改,修改起来也麻烦,因为数据库一旦安装,数据库名就写进了控制文件,数据库表,很多地方都会用到这个数据库名。是数据库系统的入口,它会内置一些高级权限的用户如SYS,SYSTEM等。我们…

Xilinx 千兆以太网TEMAC IP核 MDIO 配置及物理接口

基于AXI4-Lite接口可以访问MDIO(Management Data Input/Output)接口&#xff0c;而MDIO接口连接MAC外部的PHY芯片&#xff0c;用户可通过AXI4-Lite接口实现对PHY芯片的配置。 1 MDIO接口简介 开放系统互连模型OSI的最低两层分别是数据链路层和物理层&#xff0c;数据链路层的…

探讨欧盟就人工智能监管达成协议

《人工智能法案》是一项具有里程碑意义的立法&#xff0c;它可以创造一个有利的环境&#xff0c;在这种环境中&#xff0c;人工智能的使用将成为一种更优秀的安全和信任的工具&#xff0c;确保整个欧盟的公共和私人机构利益相关者的参与。 历时3天的“马拉松式”谈判圆满结束&…

数据可视化训练第四天(模拟投掷筛子并且统计频次)

投掷一个筛子 import matplotlib.pyplot as plt from random import randint import numpy as npclass Die:"""模拟投掷筛子"""def __init__(self,num_sides6):self.num_sidesnum_sidesdef roll(self):return randint(1,self.num_sides)num1000…

vi\vim编辑器

root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09; root用户拥有最大的系统操作权限&#xff0c;而普通…

论文盲审吐槽多,谁给盲审不负责的老师买单?如何看待浙江大学「一刀切」的研究生学位论文双盲评审制度?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

二维数组 和 变长数组

在上一期的内容中&#xff0c;为诸君讲解到了一维数组&#xff0c;在一维数组的基础上&#xff0c;C语言中还有着多维数组&#xff0c;其中&#xff0c;比较典型且运用较为广泛的就是我们今天的主角——二维数组 一 . 二维数组的概念 我们把单个或者多个元素组成的数组定义为一…

DI-engine强化学习入门(七)如何自定义神经网络模型

在强化学习中,需要根据决策问题和策略选择合适的神经网络。DI-engine中,神经网络模型可以通过两种方式指定: 使用配置文件中的cfg.policy.model自动生成默认模型。这种方式下,可以在配置文件中指定神经网络的类型(MLP、CNN等)以及超参数(隐层大小、激活函数等),DI-engine会根据…

【漏洞复现】泛微OA E-Cology XmlRpcServlet文件读取漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology XmlRpcServlet存在任意文件读取漏洞&#xff0c;允许未经授权的用户读…

三星硬盘格式化后怎么恢复数据

在数字化时代&#xff0c;硬盘作为数据存储的核心部件&#xff0c;承载着我们的重要文件、照片、视频等资料。然而&#xff0c;不慎的格式化操作可能使我们失去宝贵的数据。面对这样的困境&#xff0c;许多用户可能会感到无助和焦虑。本文旨在为三星硬盘用户提供格式化后的数据…

计算机网络实验2:路由器常用协议配置

实验目的和要求 掌握路由器基本配置原理理解路由器路由算法原理理解路由器路由配置方法实验项目内容 路由器的基本配置 路由器单臂路由配置 路由器静态路由配置 路由器RIP动态路由配置 路由器OSPF动态路由配置实验环境 1. 硬件&#xff1a;PC机&#xff1b; 2. 软…

金三银四面试题(二十六):责任链模式知多少?

什么是责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;旨在通过将请求的处理分布在一系列对象上&#xff0c;从而使得多个对象可以尝试处理同一个请求。这些对象被链接成一条链&#xff0c;每个对象都可以对请…

stm32——OLED篇

技术笔记&#xff01; 一、OLED显示屏介绍&#xff08;了解&#xff09; 1. OLED显示屏简介 二、OLED驱动原理&#xff08;熟悉&#xff09; 1. 驱动OLED驱动芯片的步骤 2. SSD1306工作时序 三、OLED驱动芯片简介&#xff08;掌握&#xff09; 1. 常用SSD1306指令 2. …

专业130+总分400+哈尔滨工程大学810信号与系统考研哈工程水声电子信息通信工程,真题,大纲,参考书。

毕业设计刚搞完&#xff0c;总结一下去年考研的复习经历&#xff0c;希望对大家复习有帮助&#xff0c;考研专业课810信号与系统130总分400&#xff0c;如愿上岸哈工程水声。专业课&#xff1a;130 哈工程水声院810专业课信号与系统难度适中&#xff0c;目前数一难度很高&…

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter)

【C语言/Python】嵌入式常用数据滤波处理&#xff1a;卡尔曼滤波器的简易实现方式&#xff08;Kalman Filter&#xff09; 文章目录 卡尔曼滤波卡尔曼滤波公式卡尔曼滤波数据处理效果C语言的卡尔曼滤波实现附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Pack…

TCP三次握手四次挥手 UDP

TCP是面向链接的协议&#xff0c;而UDP是无连接的协议 TCP的三次握手 三次传输过程是纯粹的不涉及数据&#xff0c;三次握手的几个数据包中不包含数据内容。它的应用层&#xff0c;数据部分是空的&#xff0c;只是TCP实现会话建立&#xff0c;点到点的连接 TCP的四次挥手 第四…