<ul id='list'>
<li class='item'>Item1</li>
<li class='item'>Item2 </li>
</ul>
var tag = {
tag: 'ul',
attrs: {
id: 'list'
},
children: [
{
tag: 'li',
attrs: {
className: 'item'
},
children: ['Item1']
},
{
tag: 'li',
attrs: {
className: 'item'
},
children: ['Item1']
}
]
}
/**
* vdom如何使用,snabbdom的实现vdom的库
* h函数,patch函数
* vue在官方文档中提到与react的渲染性能对比中,因为其使用了snabbdom而有更优异的性能。
*/
snabbdom是一个Virtual - DOM的实现库,它专注于使用的简单以及功能和的模型化,并在效率和性能上有着很好的表现。如果你还不知道什么是Virtual - DOM技术,它是一种网页中通过diff算法来实现网页修改最小化的方法,
react底层使用了这样的机制来提高性能。从Vue2发布开始,也开始使用了这样的机制。Vue并没有选择自己重新造一套Virtual - DOM的算法,而是在snabbdom的基础上构建了一个嵌入了框架本身的fork版本。
可以说,Vue就是在使用snabbdom的Virtual - DOM算法。
/**
* 基本的算法实现使用过程 diff,
*/
// 一、
patch(containter, vnode);
// 怎么将vnode生成真实的DOM
function creatElement(vnode) {
var tag = vnode.tag;
var attrs = vnode.attrs || {};
var children = vnode.children || [];
if (!tag) return null;
// 创建元素
var elem = document.createElement(tag);
var attrName;
for (attrName in attrs) {
if (attrs.hasOwnProperty(attrName)) {
elem.setAttribute(attrName, attrs[attrName]);
}
}
// 子元素
children.forEach(childnode => {
elem.appendChild(creatElement(childnode));
});
return elem;
}
// 二、找出差异
patch(vnode, newVnode);
// 如果二个元素类型不同、key值不同,那么认为他们是不同的元素,直接用新的元素替换前一个
function updateChildren(vnode, newVnode) {
var children = vnode.children || [];
var newChildren = newVnode.children || [];
children.forEach(function (child, index) {
var newChild = newChildren[index];
if (newChild == null) {
return;
}
if (child.tag === newChild.tag) {
// 如果二个一样使用递归
updateChildren(child, newChild);
} else {
// 如果二者不相等
replaceNode(child, newChild);
}

});
}
// 替换的操作
function replaceNode(vnode, newVnode) {
var elem = vnode.elem;
var newElem = creatElement(newVnode);
// 替换
}
/**
* v-if:条件语句,它确保在切换过程中条件内的事件监听和子组件适当的销毁和重建
* 是惰性的,如果条件为假的时候,什么也不做,只有为真的的时候,才开始渲染条件块
* ,有更高的切换开销.
* v-show:不管条件是什么,元素总会被渲染,并且只是基于css进行切换
* 一般来说,v-if具有更高的切换开销,v-show具有更高的渲染开销,如果频繁的
* 切换v-show较好,如果在运行时条件很少改变,则使用V-if,
*/
// key的作用:
// 在react中key--是用来帮助 react 识别哪些内容被更改、添加或者删除

vdom,diff,key 算法的了解的更多相关文章

  1. 谈谈Vue/React中的虚拟DOM(vDOM)与Key值

    谈谈Vue/React中的虚拟DOM(vDOM)与Key值 一.DocumentFragment 在了解虚拟DOM前,先来了解DOM的一个对象属性--DocumentFragment. 在一次操作中, ...

  2. DOM Diff(差分)算法

    1. 算法由来 React调用render()方法后,会生成一个React元素组成的树. 再次调用,生成一个新的树.React比较两者的差异,然后更新UI. 如果单纯使用算法,来查找两个DOM树的差异 ...

  3. 记一次诡异的bug调试——————关于JDK1.7和JDK1.8中HashSet的hash(key)算法的区别

    现象: 测试提了一个bug,我完全复现不了,但是最吊诡的是在其他人的机器上都可以复现.起初以为是SVN合并后出现的冲突,后来经过对比法排查: step 1: 我本地开两个jetty,一个跑合并之前的版 ...

  4. ReactiveNative学习之Diff算法

    React 源码剖析系列 - 不可思议的 react diff深入浅出React(四):虚拟DOM Diff算法解析React diff 算法总结链接引用的文章React出于性能的考虑,为了避免频繁操 ...

  5. vue diff算法 patch

    1.diff比较算法 图示: diff比较只会在同层级进行, 不会跨层级比较. 所以diff是:广度优先算法. 时间复杂度:O(n) 代码示例: <!-- 之前 --> <div&g ...

  6. 深入理解React:diff 算法

    目录 序言 React 的核心思想 传统 diff 算法 React diff 两个假设 三个策略 diff 具体优化 tree diff component diff element diff 小结 ...

  7. DIFF算法浅析(三)在react中的实现

    在虚拟dom中diff的实现. 分别从4个方面: DIFF抽象概念(概述.时间复杂性分析) 在Vue2中的实现(版本2.6.11.必要性.执行方式) 在React中的实现(版本16.13.1,必要性. ...

  8. 虚拟DOM与diff算法

    虚拟DOM与diff算法 虚拟DOM 在DOM操作中哪怕我们的数据,发生了一丢丢的变化,也会被强制重建整预DOM树.这么做,涉及到很多元素的重绘和重排,导致性能浪费严重 只要实现按需更新页面上的元素即 ...

  9. 文本diff算法Patience Diff

    一般在使用 Myers diff算法及其变体时, 对于下面这种例子工作不是很好, 让变化不易阅读, 并且容易导致合并冲突 void Chunk_copy(Chunk *src, size_t src_ ...

随机推荐

  1. 【进阶1-2期】JavaScript深入之执行上下文栈和变量对象(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/hZIpnkKqdQgQnK1BcrH6Nw 阅读笔记 JS是单线程的语言,执行顺序肯定是顺 ...

  2. LeetCode(80):删除排序数组中的重复项 II

    Medium! 题目描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额 ...

  3. java----DOS命令

    dir /?   查看帮助 dir /s   查看当前的目录,以及子目录

  4. idea 设置选中代码得背景颜色

  5. pycharm导入本地py文件时,模块下方出现红色波浪线时如何解决

    有时候导入本地模块或者py文件时,下方会出现红色的波浪线,但不影响程序的正常运行,但是在查看源函数文件时,会出现问题 问题如下:  解决方案: 1. 进入设置,找到Console下的Python Co ...

  6. What is base..ctor(); in C#?

    I am disassembling some C# applications and I am trying to reconstruct the source code. I am disasse ...

  7. Java链表和递归

    删除链表的指定元素: public class ListNode { public int val; public ListNode next; public ListNode(int x){ val ...

  8. Linux系统编程目录

    进程环境 进程控制 1. fork.vfork.clone 2. 回收子进程 3. exec函数族 进程关系 1. 进程组 2. 会话 信号 1. 函数函数sigaction.signal 2.僵尸进 ...

  9. WebService服务介绍与调用

    一: WebService简介 WebService是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言的下的一个子集)标准来描述.发布.发现.协调 ...

  10. MVC 添加JS,CSS等版本标签

    在cshtml文件标签中添加 asp-append-version="true" <img src="~/images/codedigestlogo.png&quo ...