Vue底层术语解析以及存在关系

news2024/10/6 6:44:22

Vue底层术语解析以及存在关系

  • 虚拟 DOM
  • 渲染函数
    • Vue2
    • Vue3
  • diff 算法
  • 抽象语法树(Abstract Syntax Tree,AST)
  • 关系

1

虚拟 DOM

可能都听说过虚拟dom ,虚拟dom到底是Vue的啥,再此针对性讲解(针对Vue官网简单化理解,明白意思即可)

虚拟 DOM (Virtual DOM,简称 VDOM)(VNODE) 是一种编程概念,就是将html标签(UI结构)以JavaScript对象的形式表现出来,当数据更新时都会更新这个虚拟dom,然后更新完毕后在一起渲染成真实dom,就是真实标签,渲染到页面上

采用官网的例子👇

const vnode = {
  type: 'div',
  props: {
    id: 'hello'
  },
  children: [
    /* 更多 vnode */
  ]
}
// 描述的结果就是 <div id="hello"></div>

上面这个例子就是在描述一个div标签 id属性时 “hello”,vue会把这个渲染到页面上为真实dom
上面vnode就是一个描述div标签的普通js对象 (一个“虚拟节点”),对象里面是关于这个标签的信息属性,比如标签名、类名、id名、子元素、属性等

详解可去官网查阅 https://cn.vuejs.org/guide/extras/rendering-mechanism.html#virtual-dom

渲染函数

渲染函数就是将提供的 标签信息 变为对应标签的虚拟dom
标签信息就是 标签名是啥 要渲染成哪个标签 对应的属性是什么 子标签是什么

功能都一样,只是在Vue2\Vue3表现形式不同

Vue2

在选项式API 风格中有个render方法 这个就是vue2的渲染函数 ,第一个参数为 createElement是一个回调函数
例👇

// 渲染一个<h1>内容</h1>
render: function (createElement) {
  return createElement('h1', '内容')
}

扩展👇
每个vue组件都应该有或包含下面其中一个
el,template,render(渲染函数) 都是vue对象对应的HTML元素
优先级顺序:render > template > el

createElement函数参数示例

// @returns {VNode}
createElement(
  // {String | Object | Function}
  // 一个 HTML 标签名、组件选项对象,或者
  // resolve 了上述任何一种的一个 async 函数。必填项。
  'div',

  // {Object}
  // 一个与模板中 attribute 对应的数据对象。可选。
  {
    // (详情见下一节)
  },

  // {String | Array}
  // 子级虚拟节点 (VNodes),由 `createElement()` 构建而成,
  // 也可以使用字符串来生成“文本虚拟节点”。可选。
  [
    '先写一些文字',
    createElement('h1', '一则头条'),
    createElement(MyComponent, {
      props: {
        someProp: 'foobar'
      }
    })
  ]
)

详解可去官网查阅 https://v2.cn.vuejs.org/v2/guide/render-function.html

Vue3

在组合式API 风格中提供了一个 h() 函数用于创建 多个vnode 也就是虚拟dom

官方介绍👇
h() 是 hyperscript 的简称——意思是“能生成 HTML (超文本标记语言) 的 JavaScript”。这个名字来源于许多虚拟 DOM 实现默认形成的约定。一个更准确的名称应该是 createVnode(),但当你需要多次使用渲染函数时,一个简短的名字会更省力。

例👇

import { h } from 'vue'

// 渲染一个<div id="foo" class="bar"></div>
const vnode = h(
  'div', // type
  { id: 'foo', class: 'bar' }, // props
  [
    /* children */
  ]
)

详解可去官网查阅 https://cn.vuejs.org/guide/extras/render-function.html#render-functions-jsx

diff 算法

简单来说 diff算法 是虚拟dom技术的必然产物,就是通过新旧虚拟dom作对比(即diff)将变化的地方更新在真实dom上

仔细阅读下面这段会有所理解👇
用 JavaScript 对象结构(虚拟dom)表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,渲染到浏览器页面中
当状态变更的时候,重新构造一棵新的虚拟dom树。然后用新的树和旧的树进行比较(diff),记录两棵树差异
把第二棵树所记录的差异应用到第一棵树所构建的真正的DOM树上(patch),视图就更新了

抽象语法树(Abstract Syntax Tree,AST)

官方解释: 在计算机科学中,抽象语法树 是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构

就是把一段代码进行拆分成树状结构(语法树)然后在进行组装

下面是将代码转为AST示例👇

let tips = [1,2,3,4];
{
  "type": "Program",
  "start": 0,
  "end": 201,
  "body": [
    {
      "type": "VariableDeclaration",
      "start": 179,
      "end": 200,
      "declarations": [
        {
          "type": "VariableDeclarator",
          "start": 183,
          "end": 199,
          "id": {
            "type": "Identifier",
            "start": 183,
            "end": 187,
            "name": "tips"
          },
          "init": {
            "type": "ArrayExpression",
            "start": 190,
            "end": 199,
            "elements": [
              {
                "type": "Literal",
                "start": 191,
                "end": 192,
                "value": 1,
                "raw": "1"
              },
              {
                "type": "Literal",
                "start": 193,
                "end": 194,
                "value": 2,
                "raw": "2"
              },
              {
                "type": "Literal",
                "start": 195,
                "end": 196,
                "value": 3,
                "raw": "3"
              },
              {
                "type": "Literal",
                "start": 197,
                "end": 198,
                "value": 4,
                "raw": "4"
              }
            ]
          }
        }
      ],
      "kind": "let"
    }
  ],
  "sourceType": "module"
}

可使用 AST在线解析工具 进行解析查看 https://astexplorer.net/

而在Vue中主要是处理template中html转为浏览器认识的html
1
上面知道干啥的都中,深入理解了可能就像这样1

关系

直接上图👇,仔细看
aaa






到这里就结束了,后续还会更新 前端 系列相关,还请持续关注!
感谢阅读,若有错误可以在下方评论区留言哦!!!

111


推荐文章👇
Vue中el,template,render的优先级
Vue3.0 diff算法详解(超详细)
Vue源码探秘之AST抽象语法树

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

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

相关文章

新手十分钟也能完成的Unity小游戏打砖块

由Siki学院打砖块游戏启发完成一个非常非常简单&#xff0c;纯新手也能十分钟做出来的小游戏——打砖块。 一.搭建场景 首先我们先在一个空白的3D项目中创建一个Plane平面&#xff0c;将其放置于世界中央位置&#xff0c;长宽设置为2&#xff0c;并为其添加一个材质Material&am…

掌握Go的运行时:从编译到执行

目录 一、Go运行编译简介Go语言的目标和设计哲学运行时环境编译过程小结 二、执行环境操作系统与硬件层系统调用&#xff08;Syscalls&#xff09;虚拟内存 Go运行时&#xff08;Runtime&#xff09;Goroutine调度器内存管理和垃圾收集网络I/O代码示例&#xff1a;Go运行时调度…

SQL:增、删、改、查 基本语句 Navicat建库(用法 + 例子)

文章目录 新建数据库新建表 增、删、改、查select 查找insert 添加delete 删除update 修改where 扩展 < > < > ! <> 比较运算符and or 逻辑运算符between...and... 介于..和..之间in 包含like 模糊查询is null 为空的 查询扩展order by 排序limit start coun…

7.网络原理之TCP_IP(下)

文章目录 4.传输层重点协议4.1TCP协议4.1.1TCP协议段格式4.1.2TCP原理4.1.2.1确认应答机制 ACK&#xff08;安全机制&#xff09;4.1.2.2超时重传机制&#xff08;安全机制&#xff09;4.1.2.3连接管理机制&#xff08;安全机制&#xff09;4.1.2.4滑动窗口&#xff08;效率机制…

朴素贝叶斯深度解码:从原理到深度学习应用

目录 一、简介贝叶斯定理的历史和重要性定义例子 朴素贝叶斯分类器的应用场景定义例子常见应用场景 二、贝叶斯定理基础条件概率定义例子 贝叶斯公式定义例子 三、朴素贝叶斯算法原理基本构成定义例子 分类过程定义例子 不同变体定义例子 四、朴素贝叶斯的种类高斯朴素贝叶斯&a…

LM小型可编程控制器软件(基于CoDeSys)笔记三十一:保持变量和非保持变量

所谓变量&#xff0c;就是用字母、数字和下划线组成的一个标识符。 按照数据类型的不同&#xff0c;变量可以分为标准类型和用户自定义类型。其中标准类型包括布尔型 &#xff08; BOOL &#xff09;、整型&#xff08; INT &#xff09;、实型&#xff08; REAL &#xff09…

【网络协议】TCP报文格式

1.源端口和目的端口 源端口字段占16比特&#xff0c;用来写入源端口号。源端口号用来标识发送该TCP报文段的应用进程。 目的端口字段占16比特&#xff0c;用来写入目的端口号。目的端口号用来标识接收该TCP报文段的应用进程。 2.序号 当序号增加到最后一个时&#xff0c;下…

【C语言_题库】舍罕网的失算?明明是我的失算!

test 舍罕王 失算 相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜爱象棋&#xff0c;决定让宰相自己选择何种赏赐。这位聪明的宰相指着 8 * 8 共 64 格的象棋说&#xff1a;“陛下&#xff0c;请您赏给我一些麦子吧。就在棋盘的第 1 格放 1 粒&#xff0c;第 2…

leetCode 198.打家劫舍 动态规划

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#…

机器学习---BP算法

1. 多级网络 层号确定层的高低&#xff1a;层号较小者&#xff0c;层次较低&#xff0c;层号较大者&#xff0c;层次较高。 输入层&#xff1a;被记作第0层。该层负责接收来自网络外部的信息。 第j层&#xff1a;第j-1层的直接后继层&#xff08;j>0&#xff09;&#xff…

sub0 里斯本精彩回顾:探索波卡区块的创新空间

sub0 Europe 2023 已在葡萄牙里斯本圆满结束&#xff01;sub0 大会是波卡生态开发者大会&#xff0c;由波卡协议的主要开发方 Parity Technologies 举办的开发者大会&#xff0c;汇聚了全球 Substrate 开发者和学习者&#xff0c;旨在为 Polkadot 和 Kusama 生态的开发者、贡献…

【红日靶场】vulnstack2-完整渗透过程

文章目录 一、网络拓扑二、描述配置环境渗透开始信息收集开始攻击干掉杀软cs上线权限提升 内网探测横向移动再次横向rdp连接痕迹清除 总结&#xff1a; 一、网络拓扑 网络配置&#xff1a; 二、描述 红队实战系列&#xff0c;主要以真实企业环境为实例搭建一系列靶场&#x…

Library ‘iconv2.4.0‘ not found 问题及解决方法

今天升级了一下Mac mini 和Xcode&#xff0c;运行项目就报Library iconv2.4.0 not found的错误 mac mini 升级&#xff1a;13.0 --> 13.6 xcode升级到&#xff1a;15.0(15A240d) 可以肯定 项目在旧版本下&#xff0c;是能通过编译 并且能运行的。 废话不多说&#xff0c…

网络安全——自学(黑客)方法

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

再生之术:遗忘 Root 密码的 CentOS8 Stream 解决方案

文章目录 大魔头 RootGRUB 引导界面BootLoaderGRUB主要功能选择启动的操作系统编辑内核启动参数 进入GRUB 引导界面编辑内核启动参数单用户模式 进入内核编辑界面rd.break进入单用户模式 大魔头 Root 哈哈&#xff0c;你好&#xff01;今天&#xff0c;让我们来聊聊 Linux 系统…

提高效率!掌握项目管理工具中任务优先级的使用技巧

在项目管理中&#xff0c;我们经常会遇到一些具有强制依赖关系的任务。这些任务之间的关系是绝对的&#xff0c;并且毫无疑问必须首先完成什么。例如&#xff0c;您必须先设计一个产品&#xff0c;然后才能构建它&#xff0c;并且必须先构建它&#xff0c;然后才能绘制它。然而…

嵌入式芯片-NE555

目录 1、比较器&#xff08;运放&#xff09; 2、相反门&#xff08;非门&#xff09; 3、或非门 4、双稳态触发器 5、NE555功能框图 1、比较器&#xff08;运放&#xff09; 2、相反门&#xff08;非门&#xff09; 3、或非门 4、双稳态触发器 5、NE555功能框图

FastestDet---模型训练

代码:https://github.com/dog-qiuqiu/FastestDet 一、构造数据集 数据集格式YOLO相同,每张图片对应一个txt标签文件。标签格式:“category cx cy wh”,category为类别id,cx, cy为归一化标签框中心点的坐标,w, h为归一化标签框的宽度和高度, .txt标签文件内容示例如下: 0…

基于SpringBoot的医院管理系统

目录 前言 一、技术栈 二、系统功能介绍 病床信息管理 药房信息管理 个人中心管理 药房信息 病床类别 科室信息管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网信息的飞速发展&#xff0c;医院也在创建着属于自己的管理系统。本文介…

如何像人类一样写HTML之代码编辑器的选择与基础框架

文章目录 前言一、 HTML是什么&#xff1f;二、 HTML的发展历史三、 HTML的优点a. 简单易学b. 跨浏览器兼容性c. 良好的可读性 四、 超文本是什么&#xff1f;五、 代码编辑器的选择&#xff1a;VSCodea. 安装VSCodeb. 创建HTML文件方式1方式2 c. 编写HTML代码安装Live Server插…