javascript virtual DOM
来源:互联网 发布:大数据资格认证 编辑:程序博客网 时间:2024/06/07 05:24
关于virtual Dom
一、createElement(): 用 JavaScript对象(虚拟树) 描述 真实DOM对象(真实树)
二、diff(oldNode, newNode) : 对比新旧两个虚拟树的区别,收集差异
三、patch() : 将差异应用到真实DOM树
或者
- Javascript DOM模型树(VTree),类似文档节点树(DOM)
2.DOM模型树转节点树方法(VTree -> DOM)
3.两个DOM模型树的差异算法(diff(VTree, VTree) -> PatchObject)
4.根据差异操作节点方法(patch(DOMNode, PatchObject) -> DOMNode)
关于vTree 与 React的createElement
vtree
{ // tag的名字 tagName: 'p', // 节点包含属性 properties: { style: { color: '#fff' } }, // 子节点 children: [], // 节点变动识别 key: 1}
React createElement
react.createElement('div', null, [ // 子节点img react.createElement('img', { src: "avatar.png", class: "profile" }), // 子节点h3 react.createElement('h3', null, [[user.firstName, user.lastName].join(' ')])]);
一个简单的react.createElement实现 Create函数
function create(vds, parent) { // 首先看看是不是数组,如果不是数组统一成数组 !Array.isArray(vds) && (vds = [vds]); // 如果没有父元素则创建个fragment来当父元素 parent = parent || document.createDocumentFragment(); var node; // 遍历所有VNode vds.forEach(function (vd) { // 如果VNode是文字节点 if (isText(vd)) { // 创建文字节点 node = document.createTextNode(vd.text); // 否则是元素 } else { // 创建元素 node = document.createElement(vd.tag); } // 将元素塞入父容器 parent.appendChild(node); // 看看有没有子VNode,有孩子则处理孩子VNode vd.children && vd.children.length && create(vd.children, node); // 看看有没有属性,有则处理属性 vd.properties && setProps({ style: {} }, vd.properties, node); }); return parent;}
DIFF算法
示意图
词汇概念
a. VNode
VNode 虚拟节点,它可以代表一个真实的 dom 节点。通过 createElement 方法能将 VNode 渲染成 dom 节点。
b. VText
VText 虚拟文本节点,代表了一个真实的文本节点。内容中若有 HTML 会被转义。
c. Hooks
Hooks 钩子方法,如给节点注册 ev-click 等事件。
d. Thunk
Thunk 方法允许开发者参与 diff 过程。如对于某节点,能够预先判断状态不会发生改变,则可以通过此方法,在 diff 过程中直接返回旧 VNode 。
e. Widget
Widget 和 Thunk 的作用有点相似,但它参与的是 patch 的过程。它能定制如何渲染成最终的 dom 节点。如要求某个状态只为偶数时,重新渲染等。
f. VPatch
VPatch 权且称之为「补丁对象 」,它描述了对于某个节点的具体操作,比如删除,插入,排序等等。
阅读全文
0 0
- javascript virtual DOM
- 关于虚拟Virtual DOM
- Virtual DOM 算法
- 一起理解 Virtual DOM
- React --- Virtual DOM
- 深度理解 Virtual DOM
- Virtual DOM 算法
- VUE Created\什么是Virtual Dom
- [DOM]javascript DOM操作
- Javascript DOM
- javascript--dom
- JavaScript DOM
- Dom ,JavaScript
- Javascript DOM
- javascript Dom
- JavaScript DOM
- JavaScript Dom
- javascript-DOM
- 企业基本财务指标计算
- 编译boost库 VS2017
- ubuntu安装MySQLdb模块
- 线索二叉树实例
- 他只是坐在那里
- javascript virtual DOM
- bootStrapValidator+bootStrap-select的验证不可用 解决办法
- C语言数组清空的几种方法比较
- 浅析php中常量,变量的作用域和生存周期
- 工作所用的日常 Git 命令
- 页码统计/牛客网/Python/解题报告+源代码
- linux 安装svn
- LeetCode 122. Best Time to Buy and Sell Stock II
- nginx负载均衡