<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. DataGridView中进行增删改查

    首先我们需要知道是在哪个数据库中的哪个表进行增删改查: 这就需要我们: 建立给连接服务器的类:(可以在方法类中建立) 建立一个对列名进行封装的类:方便数据之间的传接:(学到Linq-sql时这些就简便 ...

  2. Confluence 6 包括从其他 Confluence 服务器上来的通知

    Confluence workbox 可以显示从 Confluence 服务器上发送过来的消息. 让我们假设你有 2 个 Confluence 服务器, ConfluenceChatty 和 Conf ...

  3. Confluence 6 编辑自定义 Decorators

    希望对 Confluence 的 decorator 进行编辑的话,你需要具有良好的 HTML 知识和能够理解  Velocity 模板语言. 希望编辑 decorator 文件: 进入  Confl ...

  4. 基于vue-cli3的vue项目移动端样式适配,lib-flexible和postcss-px2rem

    1,安装 flexible和 postcss-px2rem(命令行安装) npm install lib-flexible --save npm install postcss-px2rem --sa ...

  5. 广工赛-hdu6468构造十叉树

    是个以前没见过的模板题.. 我用比较复杂度方式过掉了.. 构造一个十叉树(有点trie的味道)来存数字,然后字典序就是先序遍历的结果 #include<bits/stdc++.h> usi ...

  6. numpy 与 pandas

    numpy: import numpy as np np.array([1,2,3]) 创建数组 np.arange(10).reshape(2,5) 类似于range(起始,终止,步长),可以加re ...

  7. 2017-2018-2 20165314 实验三《 敏捷开发与XP实践》实验报告

    知识点: 1.XP团队使用现场客户.特殊计划方法和持续测试来提供快速的反馈和全面的交流: -XP是以开发符合客户需要的软件为目标而产生的一种方法论 -XP是一种以实践为基础的软件工程过程和思想 -XP ...

  8. 从零开始 DOM操作 笔记

        <div id="box" class="box"></div>   --> var myBox = document.g ...

  9. 2017-2018-2 20165328 实验三《敏捷开发与XP实践》实验报告

    一.实践-1: 要求:参考http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD安装alibaba插件,解决代码中的规范问题. 在ID ...

  10. openmp查看最大线程数量

    CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(omp_test) find_package(OpenMP REQUIRED) i ...