本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

码报:【图】虚拟DOM已死?(2)

时间:2016-10-24 18:13来源:本港台直播 作者:118KJ 点击:
val count = Var ( 0 ) @dom def status : Binding [ String ] = { val startTime = new Date 本页面初始化的时间是 + startTime.toString + 。按钮被按过 + count.bind.toString + 次。按钮最后

  valcount=Var( 0) @domdefstatus:Binding[ String] = { valstartTime=newDate"本页面初始化的时间是"+ startTime.toString + "。按钮被按过"+ count.bind.toString + "次。按钮最后一次按下的时间是"+ ( newDate).toString } @domdefrender={ <div> { status.bind } <button onclick={ event: Event=> count := count.get + 1}>更新状态</button> </div> }

  以上代码可以在ScalaFiddle实际运行一下试试。

  注意,status 并不是一个普通的函数,而是描述变量之间关系的特殊表达式,每次渲染时只执行其中一部分代码。比如,当 count 改变时,只有位于 count.bind 以后的代码才会重新计算。由于 val startTime = new Date 位于 count.bind 之前,并不会重新计算,所以会一直保持为打开网页首次执行时的初始值。

  有些人在学习 ReactJS 或者 AngularJS 时,需要学习 key 、 shouldComponentUpdate 、 $apply 、 $digest 等复杂概念。这些概念在 Binding.scala 中根本不存在。因为 Binding.scala 的 @dom 方法描述的是变量之间的关系。所以,Binding.scala 框架知道精确数据绑定关系,可以自动检测出需要更新的最小部分。

  结论

  本文比较了虚拟 DOM 、脏检查和精确数据绑定三种渲染机制。

AngularJS ReactJS Binding.scala
渲染机制 脏检查   虚拟DOM   精确数据绑定  
数据变更时的运算步骤

重复检查数据是否更改

大范围更新页面,哪怕这部分页面根本没有修改

 

重新生成整个虚拟DOM

比较新旧虚拟DOM的差异

根据差异更新页面

 

直接根据数据映射关系,更新最小范围页面

 
检测页面更新范围的准确性 不准   默认情况下不准,需要人工提供key和shouldComponentUpdate才能准一点    
需要前端工程师理解多少API和概念才能正确更新页面 很多   很多   只有@dom和bind两个概念  
总体性能 非常差      

  这三种机制中,Binding.scala 的精确数据绑定机制概念更少,功能更强,性能更高。我将在下一篇文章中介绍 Binding.scala 如何在渲染 HTML 时静态检查语法错误和语义错误,从而避免 bug 。

  相关链接

Binding.scala 项目主页

Binding.scala ? TodoMVC 项目主页

Binding.scala ? TodoMVC DEMO

Binding.scala ? TodoMVC 以外的其他 DEMO

Java 到 Scala.js 移植指南

Scala.js 项目主页

Scala API 参考文档

Scala.js API 参考文档

Scala.js DOM API 参考文档

Binding.scala快速上手指南

Binding.scala API参考文档

Binding.scala 的 Gitter 聊天室

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容