详解操作虚拟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 相关文章推荐
jquery 框架使用教程 AJAX篇
Oct 11 Javascript
jquery ajax请求实例深入解析
Nov 26 Javascript
一个简单的动态加载js和css的jquery代码
Sep 01 Javascript
深入分析js的冒泡事件
Dec 05 Javascript
JavaScript学习心得之概述
Jan 20 Javascript
AngularJS实用开发技巧(推荐)
Jul 13 Javascript
详解vue.js2.0父组件点击触发子组件方法
May 10 Javascript
Vue 2中ref属性的使用方法及注意事项
Jun 12 Javascript
Node.js实现文件上传的示例
Jun 28 Javascript
jquery.picsign图片标注组件实例详解
Feb 02 jQuery
VUE2.0中Jsonp的使用方法
May 22 Javascript
详解Vue数据驱动原理
Nov 17 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中的函数嵌套层数限制分析
2011/06/13 PHP
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
JavaScript 学习笔记(五)
2009/12/31 Javascript
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
javasript实现密码的隐藏与显示
2015/05/08 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
使用Python下载Bing图片(代码)
2013/11/07 Python
Python常用小技巧总结
2015/06/01 Python
解读Django框架中的低层次缓存API
2015/07/24 Python
python自动翻译实现方法
2016/05/28 Python
详解Python字符串切片
2019/05/20 Python
基于Django统计博客文章阅读量
2019/10/29 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
Python2与Python3关于字符串编码处理的差别总结
2020/09/07 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
租房合同协议书
2014/04/09 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
四风自我剖析材料
2014/09/30 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
2014年内勤工作总结
2014/11/24 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书