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(17) views6962 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • 创建非矩形网页页面元素的常用技术和实例代码

    非矩形设计正在变成一种时尚,比如波浪形、菱形、三角形等:而随着技术发展,这种设计在技术实现上也变得更容易。本文以最简单的三角形为例,演示使用5种方法来...

  • 使用HTML5 FileReader和Canvas压缩用户上传的图片

    手机用户拍的照片通常会有2M以上,这对服务器带宽产生较大压力。因此在某些应用下(对图片要求不那么高)我们可以在客户端来压缩图片,然后再提交给服务器。总体...

  • HTML5动画背后的数学2 - 仿生智能算法综述

    本文是前文

  • 使用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入门教程6 - 创建全景图和纹理

    全景图非常酷。使用Three.js做一个属于自己的全景图并不是那么困难。要做一个全景图,你需要一个软件用来做一张全景图片。我使用了iPhone上的Microsoft Photosyn...

  • HTML网页布局:静态、自适应、流式、响应式

    静态布局(Static Layout)即传统Web设计,对于PC设计一个Layout,在屏幕宽高有调整时,使用横向和竖向的滚动条来查阅被遮掩部分;对于移动设备,单独设计一个布...

  • Three.js 3D打印数据模型文件(.STL)加载

    3D打印是当下和未来10年产品技术主流方向之一,影响深远。对于电子商务类的3D打印网站,一个主要功能是把商品以3D的方式呈现出来,也就是3D数据可视化技术。HTML...

  • Processing.js和P5.js的功能简介和区别

    什么是ProcessingProcessing是关于数字艺术的编程语言,支持跨平台,语言本身是一个类Java语言,程序文件的后缀为.pde。
    什么是Processing.js为了能让Proce...

  • 使用CSS3实现流星雨动画教程

    很多营销页面中需要实现类似流星雨的动画背景,营造节日浪漫的气氛。要实现这样的效果,有两种方法,一个是使用Canvas,一个是使用纯CSS3,我们这里介绍第2种方...

  • 在PHP网页程序中执行Sass/Compass命令

    我们需要在wow云开发平台支持sass/compass等预编译样式语言,为此我们首先尝试了scssphp扩展,但是在支持最新语法上,经常会出现异常。所以我们采用了代理的方式...

  • 更多...