Web界面编程状态变化和JS开发框架(React/Angular/Ember)

techbrood 发表于 2016-12-11 18:46:50

标签: javascript, framework, state, change

- +

UI编程中的一个关键课题就是界面组件化(可复用)以及组件状态管理。

稍早一些的windows程序员可能接触过MFC,其界面编程中有一个DDX(DoDataExchange)的机制,用来绑定界面组件和数据成员。

通过这样的绑定,由框架来负责当数据发生变化时完成相应UI的更新,而无需开发者编写代码,这无疑简化了编程。

而在早期的Web开发中,数据都是通过后台程序提供,所以UI的更新一般都是通过页面刷新或者局部Ajax请求来完成的,并没有一个独立的状态管理概念,如果说有状态,那么状态也是由后台进行远端管理的,前端只是负责构建文档并渲染。

这样当然是简单的,但同时也是低效的。

为了应对组件化和状态变更管理这些UI编程的基本要求,业界先后发展了一些JS开发框架。

Backbone.js:事件通知

Backbone.js和ExtJS属于第一代JS组件化开发框架,提供可复用的界面组件,如按钮、表单、表格等。

这些框架的思想是提供了事件通知接口,但具体内容的处理留给开发者。

When the model changes, an event is produced but the updating of the UI is not covered by the framework

开发者需要去处理细节,并考虑性能方面的影响,这样就会比较麻烦些。

Ember.js:数据绑定(Data Binding)

Ember通过类似DDX的方式绑定了数据和界面组件。该框架像Backbone一样发送事件,但是不同的是,Ember框架同时处理事件的接收,并完成界面更新,这意味着有一个侦听器用于更新连接到用户界面的事件。当接收到一个事件时,该侦听器知道要做什么。

When the model changes, a binding updates the relevant locations in the DOM

这个方式下,Ember完全掌控控件数据和视图,缺点是Ember必须始终注意到数据模型中发生的变化,数据模型必须继承Ember特定的API接口。

AngularJS:脏数据检查(Dirty Check)

和Ember一样,Angular也帮助处理数据更新的细节,但和Ember主动通知的设计思路不同,Angular采用了一种观察者模式,当应用程序状态发生改变时,Angular检查每个被观察的对象,如果发现有变化,则执行更新:

Changes in the model are being actively watched from watchers set up in view templates

这样的好处是数据模型(Model)要轻量和灵活些,不需要遵循特定接口,缺点是model没有主动性,比较“傻瓜”,必须有人从外部来检查它的变化。每次点击、HTTP应答和超时处理都将触发一个digest程序,来执行这些watchers。

ECMAScript 7中的Object.observe特性将帮助简化watchers的动作。

React:虚拟DOM(Virtual Dom)

React在状态变更处理中,使用了一种貌似偷懒的方法,既不用通知,也不用观察,而是完全“重绘”,看起来好像和服务器重绘一样,但技巧就在于服务器重绘是绘制真实的DOM,而React引入了一个虚拟DOM的概念,这个虚拟DOM是一个轻量级的JS简单对象(PO),在这个对象上操作要远比真实DOM要快得多。第一次绘制时,建立虚拟DOM:

The model is first projected to a Virtual DOM, which is then rendered to a real DOM

发生变化后,React创建一个新的虚拟DOM,比较和上次虚拟DOM的区别,然后把差异部分在真实DOM上更新。

When the model changes, the Virtual DOM is re-rendered. The two version of the virtual DOM are compared, and the changes patched in the real DOM

所以React的性能取决于比较程序是否足够有效和智能,优点是消除了状态跟踪,缺点显然是占用了较多的内存。

还有一些方案如增量DOM,是内存和性能的折衷,这里不再赘述。

possitive(9) views5829 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • HTTP/2背景和新特性简介

    在前面的一篇文章中已经介绍了

  • HTTP1.1协议现状、问题和解决方案

    HTTP的现状最早的HTTP协议非常简单,只能用来传送文本,方法也只有GET,后来逐步发展到1.1,能够支持多种MIME格式数据(如文本、文件),支持GET,POST,HEAD,OPTI...

  • HTML5、Hybrid APP、Native APP对比和技术选型

    HTML5和Native APP都很容易理解。为了获得HTML5的移植性和移动本地应用的高性能,搞出来一些混合APP的解决方案。比如Apache的Cordova(也就是以前的PhoneGap),...

  • 使用SVG和CSS3创建圆形进度条动画

    圆形进度条是一个经典的控制面板元素,常用于显示任务进度,比如用户档案的完整程度,或者升级状态。有很多方法来实现圆形进度条,比如用JS, CSS3, Canvas, SVG...

  • 纹理基础知识和过滤模式详解

    1、 为什么在纹理采样时需要texture filter(纹理过滤)。
    我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中心和纹理上的texel中心并不一至(pixe...

  • Blender2.7 快捷键一览表

    通用操作
    停止当前操作:ESC
    快捷搜索:SPACE撤销:ctrl+z重做:ctrl+shift+z渲染:F12
    单选:鼠标右键(RMB)全选:A
    框选:B
    刷选:...

  • 如何使用Three.js加载obj和mtl文件

    OBJ和MTL是3D模型的几何模型文件和材料文件。在最新的three.js版本(r78)中,以前的OBJMTLLoader类已废弃。现在要加载OBJ和MTL文件,需要结合OBJLoader和MTLLoade...

  • Three.js入门教程4 - 创建粒子系统动画

    嗨,又见面了。这么说我们已经开始学习Three.js了,如果你还没有看过之前三篇教程,建议你先读完。如果你已经读完前面的教程了,你可能会想做一些关于粒子的东西。让我们直面这个话题吧,每个人都爱粒子效果。不管你是否知道,你可以很轻易地创建它们。

  • CSS3图片混合(Blend)效果及其参考计算公式一览表

    在Photoshop软件中,混合是将两个图层的色彩值进行合成,从而创造出大量的效果。在这些效果的背后实际是一些简单的数学公式在起作用。下面所介绍的公式仅适用于R...

  • WebGL入门教程5 - 详解纹理滤镜(Texture Filter)

    WebGL中使用纹理贴图来实现细腻的物体表面观感,其中一个重要的参数是纹理滤镜(Texture Filter)。
    这个参数用来处理当对象出现缩放时,纹理如何处理中间...

  • WebGL入门教程1 - 3D绘图基础知识

    现代浏览器努力使得Web用户体验更为丰富,而WebGL正处于这样的技术生态系统的中心位置。其应用范围覆盖在线游戏、大数据可视化、计算机辅助设计、虚拟现实以及数...

  • 更多...