详解操作虚拟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 相关文章推荐
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
Mar 09 Javascript
Javascript new关键字的玄机 以及其它
Aug 25 Javascript
JavaScript中的面向对象介绍
Jun 30 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
May 31 Javascript
快速处理vue渲染前的显示问题
Mar 05 Javascript
一个Vue页面的内存泄露分析详解
Jun 25 Javascript
浅谈微信小程序flex布局基础
Sep 10 Javascript
vue axios基于常见业务场景的二次封装的实现
Sep 21 Javascript
对layui中table组件工具栏的使用详解
Sep 19 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
Aug 09 Javascript
微信小程序中target和currentTarget的区别小结
Nov 06 Javascript
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
浅析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和ACCESS写聊天室(六)
2006/10/09 PHP
linux iconv方法的使用
2011/10/01 PHP
如何用php获取程序执行的时间
2013/06/09 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
分享php分页的功能模块
2015/06/16 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
Javascript中的getter和setter初识
2017/08/17 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python中os操作文件及文件路径实例汇总
2015/01/15 Python
Python中的pprint折腾记
2015/01/21 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
一套PHP的笔试题
2013/05/31 面试题
职业生涯规划怎么写
2013/12/29 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
如何写好优秀的创业计划书
2014/01/30 职场文书
英文邀请函
2015/02/02 职场文书
社区党员干部承诺书
2015/05/04 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python