当前位置: 首页 > news >正文

360免费做网站百度指数大数据分享平台

360免费做网站,百度指数大数据分享平台,wordpress 情侣博客,重庆营销型网站建设虚拟dom-Diff算法 vue2 diff算法在vue2中就是patch,通过新旧虚拟dom对比,找到最小变化然后进行dom操作 在页面首次渲染的时候会调用一次patch并创建新的vnode,不会进行深层次的比较,然后再组件中数据发生变化的时候,…

虚拟dom-Diff算法

vue2

diff算法在vue2中就是patch,通过新旧虚拟dom对比,找到最小变化然后进行dom操作
在页面首次渲染的时候会调用一次patch并创建新的vnode,不会进行深层次的比较,然后再组件中数据发生变化的时候,会触发setter然后通过notify通知watcher,对应的watcher会通知更新并执行更新函数,会执行render函数获取新的虚拟dom,然后执行patch对比上次渲染结果的老的dom,计算出最小的变化,根据最小的变化去更新真实的dom

什么是diff算法

diff是新旧内容之间的区别经计算,vue中的diff算法,就是通过一种简单而且高效的手段对比出新旧节点数组之间的区别以便以最小的dom操作来更新页面内容

  • 对比的是vnode数组
  • 同时存在新旧两组vnode数组
    真实的dom节点都是树的形式存在的,根节点都是, 为了保证虚拟节点能和真实dom节点一样,vnode也采用树形结构
    如果再组件更新的时候,需要对比全部vnode节点的话,新旧两组节点需要及进行深度遍历和比较,会产生很大的性能开销,所以,vue中默认同层节点比较,多余层级的内容会直接新建或者舍弃,只再同层级进行diff操作
    一般来说,diff操作一般发生在v-for循环或者有v-if/v-else,component这类动态生成的节点对象上

diff算法的优化

只会对比同一层级,不会跨级比较

在这里插入图片描述

比较标签名

如果同一层级的比较标签名不同,旧直接移除老的虚拟节点
在这里插入图片描述

比较key

从标签名相同,key相同,就会被认为是相同节点,也不继续按照这个树状结果做深度比较,比如写v-for的时候会比较key,不写key就会报错
在这里插入图片描述

在不使用key或者列表的index作为key的时候,每个元素对应的位置关系都是index,如果没有key的话,后续的li都会重新渲染。如果使用key的话,后续会判断li3和li4没有发生变化,所以不会重新渲染。

  • key的作用是为了更加搞笑的更新虚拟dom,因为可以非常精确的找到相同节点
  • vue在patch过程中会判断两个节点是不是相同节点,key是一个必要条件。如果在渲染列表的时候,不写key,vue在比较的时候,导致频繁更新元素,使得整个patch比较低效
  • 避免使用数组下标作为key,因为key值不是唯一的话,可能导致出现上图的bug。
  • vue判断两个节点是否相同的时候需要主动判断两者的元素类型和key,如果不设置key,就可能被认为两个相同的节点,只能做更新操作,造成大量不必要的dom更新操作。

双端diff

简单diff算法: 通过暴力手段直接遍历两个数组。双端就是从两端开始分别从中间进行遍历对比的算法

  1. 新旧头相等
  2. 新旧尾相等
  3. 旧头等于新尾
  4. 旧尾等于新头
  5. 四者互不相等
新头旧尾

在这里插入图片描述

头头相等

在这里插入图片描述

尾尾比较

在这里插入图片描述

新尾旧头

在这里插入图片描述

循环比较

在这里插入图片描述

增删

循环没有找到

在这里插入图片描述

头头,尾尾,头尾, 尾头没有匹配到,然后循环遍历,如果循环遍历没有找到,则生成这个节点。

children内增加节点
头头

在这里插入图片描述

尾尾

在这里插入图片描述

children内减少节点

在这里插入图片描述

增加整个children

在这里插入图片描述

删除整个children

在这里插入图片描述

vue3

什么时候用到了diff算法

存在children的vnode类型,element类型中vnode中存在children
flagment碎片类型vnode,可以创建一个具有多个dom节点的组件的方法就是创建一个没有底层vue实例的功能组件

<template><span>1</span><span>2</span><span>3</span>
</template>
// flagment出现就是看起来像一个普通的dom元素,但是是虚拟的,不会在dom树中呈现
<Fragment><span>1</span><span>2</span><span>3</span>
</Fragment>

patchChildren根据是否存在key进行真正的diff或者直接patch

diff算法

头和头比
尾和尾比
基于最长递增子序列进行移动/添加/删除

先进行头和头比较,发现不同旧结束循环
然后进行尾和尾比较,发现不同就结束循环
在保存没有比较过的节点,并通过newIndexToOldIndexMap拿到数组里面对应的下标,生成数组,-1是老数组里没有的就是说明是新增
然后取出数组里面的最长递增子序列,
然后只需要把其他的剩余节点,基于最长子序列的位置进行移动新增和删除就可以了
比较新老children的length获取最小值,然后对于公共部分,重新进行patch工作
如果老节点数量大于新的节点数量,移除多出来的节点
如果新的节点数量大于老的节点数量,重新mountChildren新增的节点
在这里插入图片描述

在这里插入图片描述

如果老节点是否全部patch,新节点没有被patch完,创建新的vnode
如果新节点全部被patch,老节点有剩余,那么卸载所有老节点

最长子序列

这个核心,后续回写

http://www.khdw.cn/news/15682.html

相关文章:

  • 提供邯郸企业建网站网站媒体推广方案
  • 做网站前端用什么廊坊关键词优化报价
  • 什么网站可以做电子画册公关公司的主要业务
  • 汉中商城网站建设磁力猫torrent kitty
  • 国内设计师个人网页关于华大18年专注seo服务网站制作应用开发
  • yahoo网站提交入口国外推广都是怎么推广
  • 中国新闻社名词解释上海怎么做seo推广
  • b2c电子商务网站建设费用seo网站关键词排名优化
  • 网站首页的滚动图片怎么做的今日热搜榜前十名
  • 单位做网站注意什么经典软文
  • 网站开发的逻辑google官网登录
  • 网页设计作品特色及亮点seo自动点击排名
  • 爬墙专用加速器河南seo排名
  • 网站搭建南京网站策划是做什么的
  • 企业网站是否可以做淘宝客枫林seo工具
  • 东营网站建设专业定制网络热词的利弊
  • 三亚久爱传媒招聘信息杭州优化seo
  • 网站整套模板项目代码下载武汉网站seo推广
  • 站长之家 网站模板上海优化seo排名
  • 网站扫码充值怎么做的百度网络营销的概念
  • 上海企业登记网络服务平台灰色seo关键词排名
  • 湖南大型网站建设公司视频外链在线生成
  • 动态网站用数据库怎么做重庆百度快照优化
  • iis添加网站 别名百度网站电话是多少
  • 东城网站设计疫情最新动态
  • 网站建设类公司如何推广网址链接
  • 做淘宝团购的网站包头网站建设推广
  • 菏泽企业做网站上海还能推seo吗
  • 厦门网站建设哪家好在线优化工具
  • 合肥建设网站资质办理产品营销策划