详解操作虚拟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 indexOf函数使用说明
Jul 03 Javascript
jQuery live
May 15 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
May 03 Javascript
JS获取url链接字符串 location.href
Dec 23 Javascript
学习JavaScript设计模式(链式调用)
Nov 26 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
Aug 25 Javascript
javaScript如何跳出多重循环break、continue
Sep 01 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
Sep 26 Javascript
Vue面试题及Vue知识点整理
Oct 07 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 Javascript
javascript中可能用得到的全部的排序算法
Mar 05 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提取中文首字母
2008/04/09 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
浅谈json_encode用法
2015/03/05 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
使用JavaScript实现连续滚动字幕效果的方法
2015/07/07 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
Python编程之Re模块下的函数介绍
2017/10/28 Python
python语言中有算法吗
2020/06/16 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
英国航空官网:British Airways
2016/09/11 全球购物
露营世界:Camping World
2017/02/02 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
当当网软件测试笔试题
2015/11/24 面试题
自我评价的正确写法
2013/09/19 职场文书
年度考核自我鉴定
2014/02/02 职场文书
无毒社区工作方案
2014/05/23 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
家庭困难证明
2014/10/12 职场文书
民事赔偿协议书
2014/11/02 职场文书
2015年母亲节寄语
2015/03/23 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫