详解操作虚拟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 对象的属性和方法4种不同的类型
Mar 19 Javascript
jQuery lazyload 的重复加载错误以及修复方法
Nov 19 Javascript
JS刷新框架外页面七种实现代码
Feb 18 Javascript
jquery实现邮箱自动补全功能示例分享
Feb 17 Javascript
js实现双击图片放大单击缩小的方法
Feb 17 Javascript
js中substring和substr两者区别和使用方法
Nov 09 Javascript
AngularJS  $on、$emit和$broadcast的使用
Sep 05 Javascript
vue2.0 + ele的循环表单及验证字段方法
Sep 18 Javascript
vue实现的树形结构加多选框示例
Feb 02 Javascript
详解Puppeteer前端自动化测试实践
Feb 21 Javascript
react中Suspense的使用详解
Sep 01 Javascript
如何使用JavaScript策略模式校验表单
Apr 29 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
react实现换肤功能的示例代码
2018/08/14 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
详解Python函数作用域的LEGB顺序
2016/05/14 Python
python实现画一颗树和一片森林
2018/06/25 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
2019/04/10 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
个人简历自我评价八例
2013/10/31 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
益达广告词
2014/03/14 职场文书
空乘英文求职信
2014/04/13 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
Python if else条件语句形式详解
2022/03/24 Python