渲染页面

图中框起来的部分,vue会根据响应式变化的通知生成一颗新的 Virtual Dom Tree,然后将新的Virtual Dom Tree 和之前的 Virtual Dom Tree 做 diff patch 实现。

Virtual Dom Tree

为什么要使用 VirtualDom?

通常,我们认为操作Dom 是很耗费性能的一件事情,我们可以考虑通过JS对象来模拟Dom对象,毕竟操作JS对象比操作Dom省时很多,但是在VirtualDom 中 也不能减少对Dom操作,而这一对Dom的操作都时在diff patch过程完成的。

这一步其实时节省了前端的工作量,减少了前端直接通过Dom API 完成 dom 节点 curd 的操作,从而提高了开发效率,并非时我们产品的性能。

在软件开发中遇到的所有问题都可以通过增加一层抽象去解决,从架构角度去解释,其实就是关注点分离的一种体现。而VirtualDom也是这样的分层思想。

Diff && Patch

什么是diff

从以上可以看出diff 似乎是对一个字符串的差异比较或者对比

病毒是有RNA组成的,而RNA是由四个碱基对组成的,diff 算法也通常用于在计算机生物学领域去比较RNA之间的序列的区别,

假如通过 diff 算法得出 两个 RNA 病毒的 碱基序列是相似的,那我们就能得出他们都是来自同一族群,假如其中有一个RNA 他们已经可以得到

治疗方案,或者已经有了特效药,新产生的这个RNA 也就没有过多的担忧了,所以我们学好了diff算法 ,是不是可以帮我嗯抵抗这个病毒。

下面我们学习 Vue中的 diff 策略

Diff 策略

Vue中 通过mvvm框架转换为 Virtual Dom Tree, 当我们进行一些异步操作的时候, 当变化被通知响应后,会将左边的dom tree 转化为 右边的dom tree,

转化过程中会用到我们 diff的策略。

  • 按tree的层级进行diff

在主流框架中一般都会按tree的层级进行diff,原因是在web ui 中很少会出现 dom 的层级结构会因为交互而产生更新,因此我们的virtual dom的策略就是在新旧节点之间按照层级进行diff 而得到差异。

  • 按类型进行diff

不管virtual dom 中节点数据对应的是原生dom节点还是说vue 的组件,不同节点对应的指数,节点结构差异是很明显的,因此对不同结构类型投入的diff成本与产出比差异是很大的,为了提升效率,virtual dom 只对相同类型的同一节点 diff,当新旧节点发生类型改变时,不进行指数的比较而直接创建新类型的virtual dom 替换旧节点

  • 列表diff

在列表diff中,可以通过设置key 可以提升diff 的效率

免责声明

本文只是在学习vue diff算法中的一些笔记,文中的资料也会涉及到引用,具体出处不详,商业用途请谨慎转载。

vue是如何通过diff算法做渲染更新的更多相关文章

  1. 理解Vue 2.5的Diff算法

    DOM"天生就慢",所以前端各大框架都提供了对DOM操作进行优化的办法,Angular中的是脏值检查,React首先提出了Virtual Dom,Vue2.0也加入了Virtual ...

  2. vue虚拟dom和diff算法

    vue的虚拟dom和diff算法 1.虚拟dom 虚拟dom,我的理解就是通过js对象的方式来具体化每一个节点,把dom树上面的每个节点都变为对象里的一个元素,元素的子元素变为子节点,节点上面的cla ...

  3. Vue中diff算法的理解

    Vue中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DOM结 ...

  4. diff算法深入一下?

    文章转自豆皮范儿-diff算法深入一下 一.前言 有同学问:能否详细说一下 diff 算法. 简单说:diff 算法是一种优化手段,将前后两个模块进行差异化比较,修补(更新)差异的过程叫做 patch ...

  5. React的diff算法(译文)

    前言  此篇文章主要是因为在看Virtual DOM(虚拟DOM)的时候看到的主要讲的是实现Virtual Dom 的diff算法,原文地址:https://calendar.perfplanet.c ...

  6. react虚拟dom diff算法

    react虚拟dom:依据diff算法 前端:更新状态.更新视图:所以前端页面的性能问题主要是由Dom操作引起的,解放Dom操作复杂性 刻不容缓 因为:Dom渲染慢,而JS解析编译相对非常非常非常快! ...

  7. (待补充)diff 算法解析

    今天,学习React的时候,底层提到了 diff算法,顺藤摸瓜, 也发现了VUE也使用了diff算法. mark一下,后续补充 infoq-VUE-diff算法 react-diff算法

  8. Vue源码终笔-VNode更新与diff算法初探

    写完这个就差不多了,准备干新项目了. 确实挺不擅长写东西,感觉都是罗列代码写点注释的感觉,这篇就简单阐述一下数据变动时DOM是如何更新的,主要讲解下其中的diff算法. 先来个正常的html模板: & ...

  9. 详解vue的diff算法

    前言 我的目标是写一个非常详细的关于diff的干货,所以本文有点长.也会用到大量的图片以及代码举例,目的让看这篇文章的朋友一定弄明白diff的边边角角. 先来了解几个点... 1. 当数据发生变化时, ...

随机推荐

  1. 数仓day04----日志预处理2

    1.详细描述idmap的整个计算方案 (1)使用SparkSession对象读取用户不同类别的埋点日志,解析并抽取出相应的标识id,使用union进行合并,得到装有汇总标识id的rdd(ids) (2 ...

  2. ORACLE lag,lead

    oracle中想取对应列前几行或者后几行的数据时可以使用lag和lead分析函数 lag:是滞后的意思,表示本行数据是要查询的数据后面,即查询之前行的记录. lead:是领队的意思,表示本行数据是要查 ...

  3. GO类型转换

    golang []byte转string golang中,字符切片[]byte转换成string最简单的方式是 package main import ( "fmt" _ &quo ...

  4. 【HarmonyOS】【Json解析】ZSON 与 HiJson 使用

    HiLog配置 为了方便调试,查看,先设置好Hilog public static final HiLogLabel loglabel = new HiLogLabel(HiLog.LOG_APP,0 ...

  5. 【CentOS】检查系统是否安装OpenSSH

    CentOS7 远程联机 哔哩哔哩 萌狼蓝天 博客:https://mllt.cc 微信公众号:萌狼蓝天 检查与安装配置OpenSSH [CentOS7]检查系统是否安装OpenSSH yum -q ...

  6. 关于为了一时方便,使用@Scheduled注解定时踩的坑

    摘要: 事情是这样的前两周在做项目的时候碰到一个需求---要求每天晚上执行一个任务,公司统一使用的是 xxl-job 写定时任务的,我当时为了方便自己,然后就简单的使用了Spring的那个@Sched ...

  7. Webpack学习篇

    <深入浅出Webpack>优化篇 01 Webpack 优化可以分为开发优化和输出质量优化两部分,主要要点如下: 优化开发体验,提升开发效率 优化构建速度 优化使用体验 优化输出质量 减少 ...

  8. Nginx配置正向代理

    目录 一.简介 二.配置 三.参数 一.简介 场景: 用于内网机器访问外网,就需要正向代理,类似VPN. 原理: A机器可以访问外网,而B,C,D机器只能内网,便可以设立正向代理,将B,C,D机器的访 ...

  9. 罗德与施瓦茨公司和TSN Systems公司为车载以太网提供纳秒级精度延时测量

    前言 随着毫米波雷达.激光雷达和摄像头等传感器的大量出现,并要求海量的传感器数据在几毫秒内传输完成并处理,使得网络延迟问题变得越发重要.测试和测量的专家Rohde&Schwarz(以下简称R& ...

  10. java 编程基础:【注解】 提取注解信息,利用自定义注解编写测试类,注解绑定事件

    提取注解信息 使用注解修饰了类.方法.成员变量等成员之后,这些注解不会自己生效,必须由开发者提供相应工具来提取并处理注解信息.   Java使用java.lang.annotation.Annotat ...