详解操作虚拟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 相关文章推荐
IE中jscript/javascript的条件编译
Sep 07 Javascript
用脚本调用样式的几种方法
Dec 09 Javascript
javascript 面向对象全新理练之继承与多态
Dec 03 Javascript
html中的input标签的checked属性jquery判断代码
Sep 19 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
Sep 09 Javascript
jQuery对html元素的取值与赋值实例详解
Dec 18 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
Mar 25 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
Nov 07 Javascript
bootstrap模态框垂直居中效果
Dec 03 Javascript
如何抽象一个Vue公共组件
Oct 17 Javascript
mpvue实现左侧导航与右侧内容的联动
Oct 21 Javascript
JavaScript日期库date-fn.js使用方法解析
Sep 09 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_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
Python根据区号生成手机号码的方法
2015/07/08 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
Python request使用方法及问题总结
2020/04/26 Python
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
人力资源经理的岗位职责范本
2014/02/28 职场文书
家长会主持词
2014/03/26 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
英文道歉信
2015/01/20 职场文书
小学数学教学反思范文
2016/02/16 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript