vue的虚拟DOM

这篇具有很好参考价值的文章主要介绍了vue的虚拟DOM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. vue的虚拟DOM (VNode VDOM)

虚拟DOM就是一个JS对象,用它来描述真实DOM

1.1 为什么 virtual dom 是好用的

demo1: 多次执行dom操作

<body>
    <div style="width: 200px; border:1px solid #000;"></div>
    <script>
        var box = document.querySelector('.box');
        var count = 0;
        console.time('a')
        for (var i = 1; i < 10002; i++) {
            count = i
            box.innerHTML += count
        }
        console.timeEnd('a')
    </script>
</body>

demo2: 只执行一次dom操作

var box = document.querySelector( '.box' ) ;
    var num =0” 
    console.time( 'b' )
      for ( var i = 1 ; i < 10002 ; i ++ ){
        num += i 
      }
      box.innerHTML = num
    console.timeEnd( 'b' )

比较运行时间:得到结论
越多的真实dom操作,越损耗性能
操作数据要大大的减少性能损耗,提高渲染效率

1.2 更新DOM的三种方案的区别

第一种更新DOM的方案

1、data数据
2、模板
3、数据 + 模板 结合,生成真实的DOM -> 视图
4、data发生了变化
5、数据 + 模板 结合,生成真实的DOM,替换原始的DOM
缺陷:
1、第一次生成了完整的DOM片段
2、第二次生成了完整的DOM片段
3、第二次的DOM替换第一次的DOM,非常耗费性能

第二种更新DOM的方案

1、data数据
2、模板
3、数据 + 模板 结合, 生成真实的DOM -> 视图
4、data发生变化
5、数据 + 模板 结合,生成真实的DOM,并不直接替换原始的DOM
6、新的DOM(DocumentFragment)和原始的DOM做比对,找差异
7、找出变化 (比如input框发生了变化)
8、只用新的DOM中的input元素,替换掉老的DOM中input元素
缺陷:
虽然DOM只是局部替换,但是在比对时候的计算是比较耗费性能的,因此,性能的提升并不明显

第三种使用虚拟DOM的方案

1、读取data数据
2、读取模板
3、数据 + 模板 生成虚拟DOM(虚拟DOM就是一个JS对象,用它来描述真实DOM)(损耗一点性能)
    原本准备生成的真实dom:   <div id=“abc”><span> hello world </span></div>
    
	虚拟DOM['div', {id: 'abc‘}, ['span', '', 'hello world']]
	
4、用虚拟DOM的结构生成真实的DOM -> 视图显示 (用document.createElement可基于虚拟DOM生成真实DOM)
	真实DOM<div id='abc'><span></span></div>
5、当data发生了变化
6、数据 + 模板 生成新的虚拟DOM['div', {id: 'abc'}, ['span', '', 'hi world11111']]
7、比较原始虚拟DOM和新的虚拟DOM的区别(diff算法),比如找到的区别是span中的内容发生了变化(极大提升了性能)
8、将变化的部分生成真实DOM(用createElement可基于虚拟DOM生成真实DOM)
9、将不同部分渲染在页面(直接操作DOM,改变span中的内容)

虚拟DOM优点:1、性能提升了      2、它使得跨端应用得以实现,比如:React Native  (RN

V(virtual虚拟)DOM的渲染流程、虚拟DOM的原理

1. 获取数据
2. 根据数据创建VDOM 虚拟DOM就是一个JS对象,用它来描述真实DOM(相当于给对象赋值)
3. 根据VDOM渲染生成真实DOM ( 根据createElement(DIV) )
4. 当数据发生改变后,又会生成新的VDOM
5. 通过 diff 算法 比对 多次生成的 VDOM, 将不同的内容比对出来,然后再进行真实DOM渲染,
   一样的内容是不会进行渲染的,这就是VDOM 的 ‘就地复用’ | ‘惰性原则’

2. vue中key值的作用

key是虚拟dom对象的标识 在更新时key起着极其重要的作用

2.1 理解key值的作用

当状态数据发生变化时,vue会根据【新数据】生成【新的虚拟dom】
随后vue进行【新的虚拟dom】与【旧的虚拟dom】的diff比较 比较规则如下:
a. 如果旧虚拟dom找到了与新虚拟dom相同的key
(1)若旧虚拟dom中内容没变,直接使用之前的真实dom
(2)若旧虚拟dom中内容发生了改变,则生成新的真实dom 随后替换掉页面中的真实dom

b. 如果旧虚拟dom未找到与新虚拟dom相同的key 
根据数据创建新的真实dom随后渲染到页面

2.2 使用index索引值作为key值

数据:  
[{ id: 1, name: '小李', age: 18 },
{ id: 2, name: '小张', age: 19 }]

初始的虚拟dom
<li key=0>小李------18  <input type="text" /></li>
<li key=1>小张------19  <input type="text" /></li>

更新后的数据
{ id: 3, name: '小王', age: 20 },
{ id: 1, name: '小李', age: 18 },
{ id: 2, name: '小张', age: 19 }

更新数据后的虚拟dom
<li key=0>小王------20  <input type="text" /></li>
<li key=1>小李------18  <input type="text" /></li>
<li key=2>小张------19  <input type="text" /></li>

2.3 使用id索引值作为key值

数据:  
[{ id: 1, name: '小李', age: 18 },
{ id: 2, name: '小张', age: 19 }]

初始的虚拟dom
<li key=1>小李------18 <input type="text" /></li>
<li key=2>小张------19 <input type="text" /></li>

更新后的数据
{ id: 3, name: '小王', age: 20 },
{ id: 1, name: '小李', age: 18 },
{ id: 2, name: '小张', age: 19 }

更新数据后的虚拟dom:   
<li key=3>小王------20 <input type="text" /></li>
<li key=1>小李------18 <input type="text" /></li>
<li key=2>小张------19 <input type="text" /></li>
key的作用主要是为了高效的更新虚拟DOM, 其原理是vue在数据更新过程中通过key可以精准判断两个节点是否是同一个,从而避免频繁更新不同元素,使得整个更新过程更加高效,减少DOM操作量,提高性能。

另外,若不设置key还可能在列表更新时引发一些隐蔽的bug。

vue中在使用相同标签名元素的过渡(transition组件)切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

3. v-if 和v-for为什么不能用在同一个元素

v-for比v-if优先,即每一次都需要遍历整个数组,影响速度。

<div
    v-for="(fileMsg,index) in fileMsgList"
    :key="fileMsg.id"
    v-if="index < 2"
    >
    <sys-file-layout :fileMsg="fileMsg"></sys-file-layout>
</div>

以上代码,如果有100条数据,虽然显示两条,但需要遍历100次,因为v-for优先

更好的解决方案: 是用computed先获取符合条件的数据,再进行遍历文章来源地址https://www.toymoban.com/news/detail-488244.html

到了这里,关于vue的虚拟DOM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue面试之虚拟DOM

        最近在整理一些前端面试中经常被问到的问题,分为vue相关、react相关、js相关、react相关等等专题,可持续关注后续内容,会不断进行整理~     虚拟 DOM 是用 JavaScript 对象来模拟实际 DOM 结构的一种抽象表示。它描述了组件的结构、属性和事件等信息,但与实际的页面

    2024年01月21日
    浏览(38)
  • vue 虚拟DOM的优劣说明

    Vue.js 使用虚拟 DOM(Virtual DOM)来提高应用的性能。虚拟 DOM 是一种编程概念,它通过在内存中创建一个与真实 DOM 结构相同的虚拟结构,来优化对真实 DOM 的操作。下面是对 Vue.js 中虚拟 DOM 的优劣说明和代码示例。 优势: 性能优化 :Vue.js 通过虚拟 DOM 减少了直接操作真实

    2024年01月25日
    浏览(32)
  • 什么是 VUE的虚拟 DOM?

    虚拟 DOM(Virtual DOM)是一个在内存中以 JavaScript 对象的形式表示的轻量级的 DOM 抽象层。当页面的状态发生改变时,Vue 3 会生成新的虚拟 DOM,并通过与上一次生成的虚拟 DOM 进行比较,找出实际发生了变化的部分。然后,Vue 3 仅对这些变化的部分进行实际 DOM 操作,而不是对整

    2024年02月14日
    浏览(43)
  • vue源码阅读之什么是虚拟dom

    前面简单说过数据响应式原理,大体是个怎么流程,数据发生变化,我们界面如何更新。 依赖收集收集的是watcher,然后当数据发生变化的时候dep通知watcher,然后watcher负责updateComponent。 那么更新组件过程中,有个很重要的概念叫做虚拟dom。 所谓虚拟dom,就是用一个js对象来

    2024年02月13日
    浏览(50)
  • vue diff算法与虚拟dom知识整理(6) 感受diff算法 (不要神话虚拟dom更不要做完美主义)

    我们还是打开之前的案例 然后 将src下的index.js代码修改如下 首先 我们写入节点的方法叫 patch 我们来查一下这个单纯的意思 其实 他不是一个暴力装卸的方法 而是 修补的一个概念 因为 我们需要一个触发事件的工具 所以 我们在www文件夹下的index.html中加一个id为btn的按钮 参考

    2024年02月04日
    浏览(33)
  • vue diff算法与虚拟dom知识整理(4) h函数虚拟节点嵌套

    那么 先补充上文有一个没强调的点 h函数 当你不需要属性时 其实是可以不传的 例如 我们打开案例 打开 src下的index.js 修改代码如下 声明标签为div 不需要任何标签属性 因此 我们就直接 告诉他div 然后后面一个参数直接跟里面的文本 程序也能识别 我们运行项目 可以看到 一切

    2024年02月02日
    浏览(47)
  • vue-3:生命周期,computed,watch,filter,虚拟dom和diff算法

    生命周期 Vue生命周期的 主要阶段 :4个before, 4个ed,创建,装载,更新,销毁 记得说单词: 第一次执行前4个生命周期钩子函数, 模板在mounted时渲染完毕, 父子组件的生命周期顺序(父组件前三个,子组件前四个,父组件再第四个) computed:{} 计算属性(总价+-*/) // 对d

    2024年02月04日
    浏览(47)
  • vue3的setup 语法糖中获取slot 插槽的dom对象

    最近使用vue3开发项目,需要封装一个无限滚动的组件,使用scroll组件内置插槽接受模板的方式,所以需要在scroll组件内获取到模板渲染后dom元素的宽高。 但是setup语法糖是组件生命周期的beforeCreate和created中,而且经过测试,在mounted函数中的el属性也是null,所以得出结论模板

    2024年02月15日
    浏览(57)
  • Vue3前端开发,如何获取组件内dom对象以及子组件的属性和方法

    Vue3前端开发,借助Ref来获取组件内dom对象,借助defineExpose编译宏可以获取到子组件的属性和方法。 app入口文件,我们作为父组件,在里面调用了自定义组件TestCom.vue。 先做了一个测试,借助于ref来访问自身的dom对象。如图所示是可以拿到的。 ref又称谓钩子函数,在vue2版本中

    2024年01月22日
    浏览(60)
  • 【vue3 + vite】: Invalid VNode type: undefined (undefined)

    在使用 vue3 注册全局组件的时候,使用 app.component 注册组件在使用的时候会报:Invalid VNode type: undefined (undefined) 的错误。 解决:    引入 defineAsyncComponent(定义一个异步组件,它在运行时是懒加载的。参数可以是一个异步加载函数,或是对加载行为进行更具体定制的一个选

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包