Vue的虚拟DOM和diff算法你了解吗

 更新时间:2022年02月10日 15:52:41   作者:旺仔流奶  
这篇文章主要为大家详细介绍了Vue的虚拟DOM和diff算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

在vue 中

数据改变 -> 虚拟DOM(计算变更)-> 操作DOM -> 视图更新

虚拟DOM: js执行速度比较快

什么是虚拟DOM?

用JS模拟DOM结构

为什么需要虚拟DOM?

vue中 数据驱动视图,需要用高效方法来控制DOM操作的次数

diff算法: 虚拟DOM的核心

patch函数

两个使用场景:

首次渲染时,判断第一个参数是否是一个真实dom元素,是的话就创建空vnode,并且关联一个DOM元素,然后比较patch函数传入的第一个参数和第二个参数是否是同一个vnode,如果是同一个vnode,那么就直接patchVnode做更新,如果是不同的vnode,那么就创建新的DOM元素,插入,并且把老的DOM元素删除。

patchVnode函数:

updateChildren函数:

DOM Diff

对比两个虚拟节点,找出他们的差异,然后对应到真实DOM节点 去打补丁(patch)的过程

目的:以最小的代价来去修改DOM

虚拟节点:将真实DOM用一个对象来表达出来。

defineProperty Proxy的区别:

本质上有不同,所以使用上有所不同。

defineProperty 本质是给对象增加属性用的,所以在修改数组长度,用索引设置数组的值,数组的push(),pop() 是无法触发

defineProperty 中的set 的。所以Vue2中是使用自己定义的一些数组方法来实现的。

Proxy 没有这个缺点。

Vue2 中不使用Proxy的原因是因为proxy是属于ES6,当时考虑的是兼容性的问题。

Reflect 反射 内置对象 方法集合的容器

Reflect 的好处:

之前的好多方法都挂在Object上,就很混乱。

未来很多方法都会逐渐放在Reflect上,成为内置方法的容器,统一管理各种方法。

Reflect.has(obj,'a') // 函数式编程。

对比 'a' in obj

Object中的方法有些会直接抛出异常,需要包裹try catch

而Reflect中的方法一般都有返回值,失败后会合理返回。

Proxy 中handler中的方法 和Reflect中的方法是一一对应的。

Reflect 是ES6中全局的内置对象。直接保存的静态方法,不需要实例化,可以直接使用。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!    

相关文章

  • Vue表单数据修改与删除功能实现

    Vue表单数据修改与删除功能实现

    本文通过实例代码介绍了Vue表单数据修改与删除功能实现,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起看看吧
    2023-10-10
  • Vue操作数组的几种常用方法小结

    Vue操作数组的几种常用方法小结

    本文主要介绍了Vue操作数组的几种常用方法小结,主要包括map、filter、forEach、find 和 findIndex 、some 和 every、includes、Array.from这几种方法,感兴趣的可以了解一下
    2023-09-09
  • Flutter部件内部状态管理小结之实现Vue的v-model功能

    Flutter部件内部状态管理小结之实现Vue的v-model功能

    本文是 Flutter 部件内部状态管理的小结,从部件的基础开始,到部件的状态管理,并且在过程中实现一个类似 Vue 的 v-model 的功能,感兴趣的朋友跟随小编一起看看吧
    2019-06-06
  • Vue-Router滚动行为的具体使用

    Vue-Router滚动行为的具体使用

    在 Vue Router 中,你可以使用滚动行为来定义路由切换时页面滚动的行为,本文就详细的介绍一下Vue-Router滚动行为的具体使用,感兴趣的可以了解一下
    2023-08-08
  • 详解vue 项目白屏解决方案

    详解vue 项目白屏解决方案

    这篇文章主要介绍了详解vue 项目白屏解决方案,详细的介绍了白屏的解决方案,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • vue中父组件通过props向子组件传递数据但子组件接收不到解决办法

    vue中父组件通过props向子组件传递数据但子组件接收不到解决办法

    大家都知道可以使用props将父组件的数据传给子组件,下面这篇文章主要给大家介绍了关于vue中父组件通过props向子组件传递数据但子组件接收不到的解决办法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • vue中如何使用唯一标识uuid(uuid.v1()-时间戳、uuid.v4()-随机数)

    vue中如何使用唯一标识uuid(uuid.v1()-时间戳、uuid.v4()-随机数)

    这篇文章主要给大家介绍了关于vue中如何使用唯一标识uuid(uuid.v1()-时间戳、uuid.v4()-随机数)的相关资料,当使用Vue.js生成UUID时,我们可以使用uuid库来帮助我们生成通用唯一标识符(UUID),需要的朋友可以参考下
    2023-12-12
  • Vue2.0/3.0双向数据绑定的实现原理详解

    Vue2.0/3.0双向数据绑定的实现原理详解

    这篇文章主要给大家介绍了关于Vue2.0/3.0双向数据绑定的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 如何在vue3+ts项目中使用query和params传参

    如何在vue3+ts项目中使用query和params传参

    Vue3中的路由传参有两种方式:query和params,下面这篇文章主要给大家介绍了关于如何在vue3+ts项目中使用query和params传参的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Vue项目如何根据不同运行环境打包项目

    Vue项目如何根据不同运行环境打包项目

    这篇文章主要介绍了Vue项目如何根据不同运行环境打包项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论