详解操作虚拟dom模拟react视图渲染


Posted in Javascript onJuly 25, 2018

1.为什么要使用虚拟dom?

网页性能优化->尽量少操作DOM

2..虚拟DOM(Virtual DOM) VS js直接操作原生DOM(innerHTML)

function Raw() {
  var data = _buildData(),
    html = "";
  ...
  for(var i=0; i<data.length; i++) {
    var render = template;
    render = render.replace("{{className}}", "");
    render = render.replace("{{label}}", data[i].label);
    html += render;
  }
  ...
  container.innerHTML = html;
  ...
}

以下测试用例中虽然构造了一个包含1000个Tag的String,并把它添加到DOM树中,但是只做了一次DOM操作。然而,在实际开发过程中,这1000个元素更新可能分布在20个逻辑块中,每个逻辑块中包含50个元素,当页面需要更新时,都会引起DOM树的更新,上述代码就近似变成了如下格式:

function Raw() {
  var data = _buildData(), 
    html = ""; 
  ... 
  for(var i=0; i<data.length; i++) { 
    var render = template; 
    render = render.replace("{{className}}", ""); 
    render = render.replace("{{label}}", data[i].label); 
    html += render; 
    if(!(i % 50)) {
      container.innerHTML = html;
    }
  } 
  ... 
}

实际场景:实际是一个组件里经常包含多个局部视图,小小的状态变更都要重新构造整棵 DOM,性价比太低。需要更新页面较多局部视图的时候,这样的做法不可取。

3.MVVM模式和React的模板引擎。

  1. MVVM: Model-View-ViewModel MVVM 可以很好的降低我们维护状态 -> 视图的复杂程度(大大减少代码中的视图更新逻辑)。MV*模式:只要在模版中声明视图组件是和什么状态进行绑定的,双向绑定引擎就会在状态更新的时候自动。
  2. React渲染视图原理:React setState之后会将传入的参数对象与组件当前的状态合并,React 会以相对高效的方式根据新的状态构建 React 元素树并且着手重新渲染整个UI界面。React 会自动计算出新的树与老树的节点差异,然后根据差异对界面进行最小化重渲染。

4.Virtual DOM模拟ReactJS视图渲染大致逻辑:

// 1. 构建虚拟DOM
var tree = el('div', {'id': 'container'}, [
  el('h1', {style: 'color: blue'}, ['simple virtal dom']),
  el('p', ['Hello, virtual-dom']),
  el('ul', [el('li')])
])

// 2. 通过虚拟DOM构建真正的DOM
var root = tree.render()
document.body.appendChild(root)

// 3. 生成新的虚拟DOM
var newTree = el('div', {'id': 'container'}, [
  el('h1', {style: 'color: red'}, ['simple virtal dom']),
  el('p', ['Hello, virtual-dom']),
  el('ul', [el('li'), el('li')])
])

// 4. 比较两棵虚拟DOM树的不同
var patches = diff(tree, newTree)

// 5. 在真正的DOM元素上应用变更
patch(root, patches)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript下有关dom以及xml节点访问兼容问题
Nov 26 Javascript
javascript开发中因空格引发的错误
Nov 08 Javascript
IE6下通过a标签点击切换图片的问题
Nov 14 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
Jan 24 Javascript
js 获取时间间隔实现代码
May 12 Javascript
Javascript中获取对象的原型对象的方法小结
Feb 25 Javascript
浅谈JavaScript数据类型
Mar 03 Javascript
JavaScript函数柯里化详解
Apr 29 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
Apr 29 Javascript
纯JS前端实现分页代码
Jun 21 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
Jan 21 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
May 10 Javascript
浅析JS中回调函数及用法
Jul 25 #Javascript
详解使用mpvue开发github小程序总结
Jul 25 #Javascript
详解mpvue开发小程序小总结
Jul 25 #Javascript
Bootstrap table表格初始化表格数据的方法
Jul 25 #Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
Jul 24 #Javascript
微信小程序实现图片上传放大预览删除代码
Jun 28 #Javascript
vue实现底部菜单功能
Jul 24 #Javascript
You might like
php输出表格的实现代码(修正版)
2010/12/29 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
2017/03/15 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
记录一次完整的react hooks实践
2019/03/11 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
Python实现二分查找与bisect模块详解
2017/01/13 Python
python实现拓扑排序的基本教程
2018/03/11 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
菲律宾最大的网上花店和礼品店:PhilFlower.com
2018/02/09 全球购物
自我评价的正确写法
2013/09/19 职场文书
大学社团活动总结
2014/04/26 职场文书
重阳节慰问信
2015/02/15 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS