基于YUI3的组件开发

31
基于 YUI3 的组件开发 拔赤 [email protected] http://www.uedmagazine.com 2009-11-20

Transcript of 基于YUI3的组件开发

Page 1: 基于YUI3的组件开发

基于 YUI3的组件开发 拔赤 [email protected]

http://www.uedmagazine.com 2009-11-20

Page 2: 基于YUI3的组件开发

组件化的web开发

Page 3: 基于YUI3的组件开发

组件化的web开发

•项目中我们关注的是如何组装这些颗粒化的组件,而不用花费精力去考究每个组件黑盒内的实现。从而使得项目开发更加高效。

Page 4: 基于YUI3的组件开发

组件化的web 开发 续

Page 5: 基于YUI3的组件开发

YUI2.x的组件

Page 6: 基于YUI3的组件开发

YUI2.x 的组件 续

Page 7: 基于YUI3的组件开发

YUI3.x的组件?

Page 8: 基于YUI3的组件开发

YUI3.x 的组件? 续

• YUI3来势汹汹,但 YUI3还未有太多widget可用,我们需要手动开发组件。

Page 9: 基于YUI3的组件开发

组件的模样

Page 10: 基于YUI3的组件开发

组件的模样

•高内聚,低耦合• 组件 -> 不依赖环境

• 插件 -> 需要宿主环境

Page 11: 基于YUI3的组件开发

进一步看组件的模样

• 只对外暴露接口,供外界调用http://www.uedmagazine.com/test/call/Noname2.html

Page 12: 基于YUI3的组件开发

进一步看组件的模样 续

• 组件需要初始化 (构造器 ) why?• 依赖的子组件、库、皮肤• http://www.uedmagazine.com/test/tbrr.html

• 组件实例可被修改(重新初始化?)• http://www.uedmagazine.com/test/tbrr.html

Page 13: 基于YUI3的组件开发

再进一步看组件的模样

Page 14: 基于YUI3的组件开发

再进一步看组件的模样 续• 开发者需要关注的三部分

http://www.uedmagazine.com/test/tbrr.html http://www.uedmagazine.com/test/pagination-2.html http://www.uedmagazine.com/test/call/Noname2.html http://www.uedmagazine.com/test/box/msg.html

Page 15: 基于YUI3的组件开发

再进一步看组件的模样 续

• Module( data) -> 数据 不确定• View -> UI 皮肤 半确定• Controller -> 交互和组件逻辑 确定

Page 16: 基于YUI3的组件开发

设计 &开发一个组件

Page 17: 基于YUI3的组件开发

组件的设计原则

• 组件源于项目而高于项目 -> 有意义的组件

• 不对使用环境进行假设 -> 可重用的组件• 容易理解的接口、参数 -> 易用的组件• 完善的黑盒中的交互 -> 优质健壮的组件

Page 18: 基于YUI3的组件开发

组件的开发原则

• 配置项的优先级• 尽可能少的类• 源码可扩展

Page 19: 基于YUI3的组件开发

配置项的优先级

• 基础配置• 缺省配置• 必填的配置

Page 20: 基于YUI3的组件开发

配置项的优先级 续

• 基础配置,项目中确定下来即不可修改

YAHOO.CN.msg = {isShowMod:true,isHiddenScroll:true,isOpenDrag:false,//…

};

Example:YAHOO关系弹出框组件

Page 21: 基于YUI3的组件开发

配置项的优先级 续• 缺省配置,参数为空的默认值T.tbwidget.calendar.prototype = {

buildParam:function(o){var that = this;var o = o || {};that.date = o.date || new Date();that.selectedate = o.selectedate || that.date;that.duration = o.duration || 0.9;that.easing = o.easing || Y.Easing.elasticOut;that.closeable= o.closeable || true;return this;

},//…

};

Example:日历组件 http://www.uedmagazine.com/test/call/t-calendar.js

Page 22: 基于YUI3的组件开发

配置项的优先级 续

• 必填的配置:缺少必要的参数会报错

var c = new T.tbwidget.calendar(node,callback,options);

Example:日历组件 http://www.uedmagazine.com/test/call/Noname2.html

var c = new T.tbwidget.calendar(null,null,options);

正确的参数

错误的参数

Page 23: 基于YUI3的组件开发

尽可能少的类•使用单体,&,原型单体是最佳选择T.box = function(){

this.init.apply(this,arguments);};T.box.prototype = {

init:function(args){//构造器

},render:function(o){

//渲染},//…

};

Example:弹出框 http://www.uedmagazine.com/test/box/msg.html

Page 24: 基于YUI3的组件开发

组件源码的可扩展

• 组件状态相关数据的保存 ,为了再次渲染组件• 区分初始化 (init)和重新初始化 (render)

• init:生成对象new Widget()时调用

• render:根据运行时数据和当前状态渲染出ui随时调用

Example:分页组件 http://www.uedmagazine.com/test/pagination-2.html

Page 25: 基于YUI3的组件开发

组件开发进阶

Page 26: 基于YUI3的组件开发

组件开发进阶

• 属性属于对象,方法属于原型• 基于原型的 (显式 )构造器• 组件的自定义

Page 27: 基于YUI3的组件开发

基于原型的构造器T.box = function(){

this.init.apply(this,arguments);};T.box.prototype = {

init:function(args){//构造代码

},//…

};

T.box = function(o){this.a = o.sth;this.render();

};

显式构造:

隐式构造:

Example:dojo、mootools、 prototype等 js库在代码继承方面的设计

Page 28: 基于YUI3的组件开发

组件的自定义• YUI3

• T.box

Example: http://www.uedmagazine.com/test/box/msg.html Example: http://adamlu.com/Demo/dialog.html

Y.mix()=>Y.extend()Y.merge()Y.augment()

T.box()=>T.box.alert()T.box.confirm()T.box.diy()

Page 29: 基于YUI3的组件开发

组件的生命周期

• 组件来源于一个特定的项目和业务场景• 开发者将通用的功能抽取出来,形成组件原型

• 更多项目和业务场景使用这个组件• 组件越来越完善和强壮• 组件使用更加广泛,生命周期远超过某个产品的生命周期

Page 30: 基于YUI3的组件开发

Would u like to know more…

• YUI3的自定义事件• YUI3的 augment和 extend• YUI3的 plugin

Page 31: 基于YUI3的组件开发

产品恒久远 组件永流传

Thank u~