Javascript 虚拟 DOM详解
作者:ZhangLiangXWZ 发布时间:2024-04-18 10:31:30
目录
什么是虚拟 dom?
为什么需要虚拟dom?
虚拟dom是如何转换为真实dom的?
模板和虚拟dom的关系
注入
挂载
完整流程
总结
什么是虚拟 dom?
虚拟 dom 本质上就是一个普通的JS对象(mounted 中打印 this. _vnode 就是该对象内容),用于描述视图的界面结构
在vue中,每个组件都有一个render函数,每个render函数都会返回一个虚拟dom树,这也就意味着每个组件都对应一棵虚拟DOM树
vnode 是一个普通的 JS 对象,用于描述界面上应该有什么,比如:
var vnode = {
tag: "h1",
children: [
{ tag: undefined, text: "第一个vue应用:Hello World"}
]
}
上面的对象描述了:
有一个标签名为 h1 的节点,它有一个子节点,该子节点是一个文本,内容为「第一个vue应用:Hello World」
为什么需要虚拟dom?
在vue中,渲染视图会调用render函数,这种渲染不仅发生在组件创建时,同时发生在视图依赖的数据更新时。如果在渲染时,直接使用真实DOM,由于真实DOM的创建、更新、插入等操作会带来大量的性能损耗,从而就会极大的降低渲染效率。
因此,vue在渲染时,使用虚拟dom来替代真实dom,主要为解决渲染效率的问题。
对比创建js对象和真实 dom 对象效率:
结果:
创建一个真实的 dom 会伴随着创建许多的属性
虚拟dom是如何转换为真实dom的?
在一个组件实例首次被渲染时,它先生成虚拟dom树,然后根据虚拟dom树创建真实dom,并把真实dom挂载到页面中合适的位置,此时,每个虚拟dom便会对应一个真实的dom。如果页面只会刷新一次,后续不会有数据更新等问题的情况下,用虚拟 dom 的方式是比直接显示真实 dom 效率低的。
如果一个组件受响应式数据变化的影响,需要重新渲染时,它仍然会重新调用render函数,创建出一个新的虚拟dom树,用新树和旧树对比,通过对比,找出差异,然后仅更新差异部分的虚拟dom节点,最后,这些更新过的虚拟节点,会去修改它们对应的真实dom
这样一来,就保证了对真实dom达到最小的改动。
模板和虚拟dom的关系
vue框架中有一个compile(编译)模块,它主要负责将模板转换为render函数,而render函数调用后将得到虚拟dom。
编译的过程分两步:
1.将模板字符串转换成为AST(抽象语法树:用js树形结构来描述我们原始的代码;在线工具:https://astexplorer.net/)
2.将AST转换为render函数
vue 模板并不是真实的 DOM,它会被编译为虚拟 DOM
<div id="app">
<h1>第一个vue应用:{{title}}</h1>
<p>作者:{{author}}</p>
</div>
上面的模板会被编译为类似下面结构的虚拟 DOM
{
tag: "div",
children: [
{ tag: "h1", children: [ { text: "第一个vue应用:Hello World" } ] },
{ tag: "p", children: [ { text: "作者:袁" } ] }
]
}
如果使用传统的引入方式(script src="...vue.js
"),则编译时间发生在组件第一次加载时,这称之为运行时编译。
如果是在vue-cli
的默认配置下,编译发生在打包时(npm run build
),打包之后就没有模板只有 render 函数了,这称之为模板预编译。
编译是一个极其耗费性能的操作,预编译可以有效的提高运行时的性能,而且,由于运行的时候已不需要编译,vue-cli在打包时会排除掉vue中的compile模块,以减少打包体积
打包时是否需要包含 compile 模块,是通过 vue.config.js 中的 runtimeCompiler: true 来控制的,默认 false,不包含。不建议更改该配置
模板的存在,仅仅是为了让开发人员更加方便的书写界面代码
vue最终运行的时候,最终需要的是render函数,而不是模板,因此,模板中的各种语法,在虚拟dom中都是不存在的,它们都会变成虚拟dom的配置
在 vue-cli 中如果同时存在 template 和 render, 由于存在一个打包过程,其中的模板预编译会生成 render 覆盖原有的 render 函数
在 vue 中如果同时存在 template 和 render,一定是以 render 为准
虚拟 DOM 树会最终生成为真实的 DOM 树
vue通过以下逻辑生成vnode tree:
注意:虚拟节点树必须是单根的
注入
vue会将以下配置注入到vue实例:
data
:和界面相关的数据computed
:通过已有数据计算得来的数据,将来详细讲解methods
:方法
模板中可以使用vue实例中的成员
为了防止名称冲突。因为会将data中数据代理给vue,假如说我们自己写的data名称和vue中自带的属性冲突了,那么就会覆盖vue内部的属性,所以vue会把自己内部的属性成员名称前加上 或 , 如 果 加 上 的 是 或_,如果加上的是 或,如果加上的是,代表是我们可以使用的,如果加上的是_,是vue自己内部使用的方法或属性,我们不需要调用
挂载
将生成的真实 DOM 树,放置到某个元素位置,称之为挂载
挂载的方式:
1.通过el:"css选择器"进行配置
2.通过vue实例.$mount(“css选择器”)进行配置
完整流程
实例被创建: new Vue()
注入完成之后才会有响应式,能监听到数据变化
编译生成虚拟 DOM 树:首先找 render 函数,没有就找模板把它生成 render,最后运行 render,生成虚拟 DOM 树
挂载完成:页面上显示
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注asp之家的更多内容!
来源:https://blog.csdn.net/ZhangLiangXWZ/article/details/121780105


猜你喜欢
- 本文实例讲述了Python实现统计给定列表中指定数字出现次数的方法。分享给大家供大家参考,具体如下:直接看实现:#!usr/bin/env
- 有两种做法:os.walk()、pathlib库,个人感觉pathlib库的path.glob用来匹配文件比较简单。下面是第二种做法的实例(
- 刚开始涉及到图像处理的时候,在opencv等库中总会看到mask这么一个参数,非常的不理解,在查询一系列资料之后,写下它们,以供翻阅。什么是
- 使用python生成随机图片验证码,需要使用pillow模块1.安装pillow模块pip install pillow2.pillow模块
- 最简单的方法:取整后判断是否和原值相等!javascript的取整函数是:parseIntif(parseInt(value)==value
- 使用使用navicat连接远程linux mysql数据库出现10061未知故障,设置使用ssh连接后出现2013故障本机环境:win10
- 从ResNet到DenseNet上图中,左边是ResNet,右边是DenseNet,它们在跨层上的主要区别是:使用相加和使用连结。最后,将这
- 目录1. matplotlib 模块概述2. matplotlib.pyplot 相关方法3. matplotlib.pyplot 图表展示
- 这两天在整理一些文章,但是文件夹中每个文章没有序号会看起来很乱,所以想着能不能用Python写一个小脚本。于是乎,参考了多方资料,简单写了下
- 一、reversereverse()是python中列表的一个内置方法(在字典、字符串和元组中没有这个内置方法),用于列表中数据的反转例子:
- 存储过程简介----------------------------------------------------------------
- python环境 3.6.5 win7 linux环境同理先尝试了PyInstaller ,打包时一直提示 no module named
- 本文实例讲述了Python脚本实现虾米网签到功能的方法。分享给大家供大家参考,具体如下:概述这个脚本完成了自动登录虾米网、签到的功能。大致要
- 平时在PL/SQL中的编程中遇到一些问题,这里以问答的形式来进行把它们总结下来,以供大家分享。1、当需要向表中装载大量的数据流或者需要处理大
- 之前在网上看到有人提问,如何在页面上同步显示服务器的时间,其实实现方法有几种,可能 一般人立马就想到可以使用Ajax每隔一秒去请求服务器,然
- import numpy as npa = np.array([[1.1,2.1,3.1,4.1],[5,6,7,8],[9,10,11,1
- 一,原图和效果图二,代码//#########################产生随机颜色#########################
- 前言前面一篇分享了关于数值的一些处理方式,本篇呢进行一下字符串处理的分享 题目也是超级简单,记录一下对字符串处理的方式错位键盘🍓(也就是错位
- 先 Create table 吧create table emp(id int not null primary key,name varc
- 对很多从事产品工作的同事来说,“以用户为中心”是工作的重点,同时也是难点。用户的心思难以捉摸,用户研究的工作也似乎高深莫测。不过,用户研究并