`
yiminghe
  • 浏览: 1480156 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于 mixin 的组件设计

    博客分类:
  • ui
阅读更多

思路主要来源于 YUI3 component infrastructure ,利用 mixin 机制模拟 c++ 的多继承 机制,多继承争论很多,但是谨慎使用确实会带来设计的简洁明了,避免采用 Extjs 式的单继承所带来的深层结构以及由于功能聚集导致的巨型类,且功能不能在多个组件中共享。

 

ppt @ slideshare


多继承:


主要依据 c++ 规范,当多继承时,注意构造函数和析构函数的合适触发顺序,举例:

 

弹窗

 

用 c++ 多继承来设计弹窗组件,分析弹窗的功能,将弹窗理解为


1.是一个弹出层

2.具备头,体,尾组成部分

3.具备拖拽功能

4.可以被关闭


伪代码:

 

class StdMod {
    private:
          header;
          body;
          footer;
}

class Close {
    private:
        closable;
}

class Drag {
    private:
        draggable;
        handlers;
}

//待定义
class Overlay{
//...
}

class Dialog : Overlay,StdMod,Close,Drag {
}

 

弹出层

 

而弹出层又是一个复杂的东西,是很多功能的聚集体


1.是一个方形可渲染容器

2.可以被定位,隐藏

3.可以具备背景遮罩功能


伪代码:

 

class Box {
  private:
     width;
     height;
}

class Position {
   private:
       x;
       y;
       visible;
}

class Mask {
     private:
          maskable;
}


class Overlay : Box,Position,Mask{
}

 

 

弹层的生成和销毁


生成:


首先初始化基类的成员并执行基类的构造器,多个基类的构造器执行顺序,根据继承时的申明顺序指定,然后执行底层类的构造器体。


即:绑定用户值给对应的属性并执行 Box ,Position ,Mask 的构造器,然后执行 Overlay 的构造器。


销毁:


和构造器的执行顺序完全相反,只不过变成了析构器。


javascript 模拟:


而对于 javascript (有人说和c++同级... ),当然没有这些完善的对象生命周期管理,一切都得靠自己,除此之外还要加上不少的开发约定。我的实现是:这些所有构造与析构的依赖顺序全部扔给最顶层的类 Base 处理,并且由于原型链的存在使得 js 天生只能实现单继承( SI ),那么在多继承的情况下,除了第一个类,其他类只能通过 mixin 的方式混给最终类。


类的产生:


通过 Base.create(cls,[clsExt1, clsExt2,... ],prototype,staticProperty) 产生一个新构造器,该构造器的继承链上一个构造器是 cls (cls必须继承或本身就是 Base),clsExt 为扩展类数组,通过 mixin 将自己的代码混合在最终类,并将扩展类集合的构造器挂靠在新生成的类上面。

 

 

结构:

 



类的实例化:


当实例化时,统一委托 Base 的构造器就行,主要进行:


1.从顶层类开始,执行挂靠在顶层类上的扩展类构造器方法。


2.然后执行顶层类的 init 原型方法


3.依次沿继承链向下执行 1,2 步

 


类实例的销毁化:

 

 


当调用实例的 destroy 方法时,委托 Base 的原型 destroy 方法进行沿继承链的销毁工作,主要进行:


1.执行当前构造器原型的destructor方法

2.调用挂靠在当前类的扩展类构造器原型的__destructor方法,注意顺序和实例化时相反

3.依次沿继承链向上执行1,2 步。

 

 

 

最终代码:


则Overlay的最终代码为:

 

 var Overlay = Base.create(Base,[S.Ext.Box,
        S.Ext.ContentBox,
        S.Ext.Position,
        S.Ext.Shim,
        S.Ext.Mask], {

        init:function() {
            S.log("Overlay init");
        },
        destructor:function(){
            S.log("Overlay destructor");
        }
});
 


初始化顺序:


box init
contentbox init
position init
shim init
mask init
Overlay init

销毁顺序:

overlay destructor
mask __destructor
shim __destructor
position __destructor
contentbox __destructor
box __destructor


更复杂的 Dialog 可打开 firebug 查看 : 这里


组件的UI周期管理:

上面只是介绍了支持组件最基本的多继承类模拟,而对于UI组件,还要涉及

1.DOM 节点生成或直接从 markup 读取(renderUI)
2.绑定客户端事件(bindUI)
3.UI 变化和组件对应属性同步(syncUI)

这里基本上和 yui3 保持一致,约定主组件各个阶段取名:

renderUI,bindUI,syncUI

而附加组件取名:

__render,__bindUI,__syncUI

属性与 UI 同步采用 attribute 机制。


//用户扩展多继承的 UIBase 组件
function Position() {}
Position.ATTRS = { x:{}, y:{}, xy:{} }
Position.prototype = {
  __renderUI: fn,
  __bindUI: fn,
  __syncUI: fn,
  _uiSetX: fn,
  __destructor: fn
}
 

小结:

世界很复杂,完美的类抽象很难

适度继承+ 选择性mix

约定优于配置

好处:可复用性高,整体维护方便

不足:多继承会造成潜在的命名空间冲突,门槛稍高


 

 

 

 

 

 

  • 大小: 11.5 KB
  • 大小: 19 KB
分享到:
评论

相关推荐

    基于Vue的图鸟UI组件库设计源码

    本项目是一个基于Vue语言开发的图鸟UI组件库,包含296个文件,主要文件类型包括Vue组件、JavaScript脚本、SCSS样式表、图片、微信小程序的wxs脚本、JSON配置文件、Markdown文档、HTML页面和PNG图片。系统设计旨在为...

    【vue】基于elementUi组件的一款rbac权限管理.zip

    Element UI是一个基于Vue.js的组件库,它提供了一套完整的UI组件集合,用于快速构建美观且响应式的Web应用。RBAC(Role-Based Access Control)是一种基于角色的权限管理方式,它通过角色赋予用户不同的权限,从而...

    是基于uni-app进行开发的UI框架,提供丰富的组件进行快速开发

    图鸟UI是一款基于uni-app框架构建的UI工具包,它专为快速开发设计,尤其适合构建H5和微信小程序项目。uni-app是一个跨平台的前端框架,允许开发者使用一套代码库来开发iOS、Android、H5、微信小程序、支付宝小程序等...

    系统类应用vue组件

    8. **混合**:混合(mixin)是一种共享组件选项的方法,可以将一组通用功能封装在一个对象中,然后在多个组件中使用。 9. **状态管理**:对于复杂应用,可以使用Vuex进行集中式的状态管理,解决组件间的通信问题,...

    基于vue开发的popup的mixins用于管理弹出框的遮盖层

    标题和描述中提到的"基于vue开发的popup的mixins用于管理弹出框的遮盖层",就是这样一个设计模式,旨在解决如何优雅地处理弹出框及其遮盖层的问题。 首先,我们来理解一下`mixins`在Vue.js中的作用。`mixins`是一种...

    屏幕外:基于聚合物的Web组件和Sass mixin用于在屏幕外定位元素

    【标题解析】:“屏幕外:基于聚合物的Web组件和Sass mixin用于在屏幕外定位元素”这个标题涉及了几个关键概念。首先,“屏幕外”(Offscreen)通常指的是网页设计中的一种技术,用于将某些元素移动到视口之外,但...

    基于Vue框架的HTX1125前端开发设计源码

    这些文件通过Vue.js的响应式系统、组件生命周期钩子、以及各种指令和混入(mixin)来实现复杂的用户界面和交互逻辑。 接着,Markdown文件在项目中通常用于文档编写,它们提供了项目的说明、安装指南、开发指南和API...

    基于Vue3和elementPlus的SCUI设计源码:一款开箱即用、高性能、风格精致的WebUI前端框架

    Vue3的Composition API为开发者提供了更灵活的逻辑组合方式,而elementPlus则是一个基于Vue3的现代UI库,它以轻量级、高性能和丰富的组件集合著称,两者结合无疑为前端开发注入了新的活力。 SCUI设计源码的开箱即用...

    基于Vue框架的官网站点设计源码

    该官方站点设计源码项目,基于Vue框架,涵盖了组件化开发、交互逻辑、视觉设计、样式设计、配置管理、环境优化、开源规范以及项目维护等多个方面。它不仅适用于官方展示和宣传,也为前端开发者提供了一个学习和实践...

    基于Vue框架的美发店消费管理系统前端设计源码

    本项目所提供的“基于Vue框架的美发店消费管理系统前端设计源码”,正是为此目的而生,它不仅包含了一个完整系统的前端代码,而且提供了详细的文件结构和内容说明,使得开发者能够快速理解和上手项目。 项目采用Vue...

    mixin.one::information: 网站和 Mixin 网络浏览器

    Mixin.one 可能是一个基于互联网的平台或者服务,而 Mixin 网络浏览器则可能是该平台的一部分,专门用于浏览或交互。这暗示我们可能会讨论一个特定的、与 Mixin 生态系统相关的网站和其内置的浏览器应用。 【描述...

    react-waypoint:Mixin 用于向 React 组件添加航点功能

    `react-waypoint`库就是为了解决这类问题而设计的,它提供了一个Mixin,使得React组件能够轻松实现“航点”(waypoint)功能。航点是一种在用户滚动到特定页面区域时触发事件的概念。 ### 1. `react-waypoint` 库...

    基于Vue框架的上海地产h5网页设计源码

    本项目基于流行的前端框架Vue.js,为上海地产行业量身定制了一个H5网页设计源码。该源码集成了多种现代网页开发技术,不仅提供了丰富的资源文件,还包含了一套完整的开发环境配置,可以快速上手并构建出专业的地产...

    基于Vue、JavaScript和HTML的KTV点歌系统前台Scss设计源码

    因此,一款基于现代前端技术的KTV点歌系统前台设计源码的出现,无疑为业界带来了一种全新的解决方案。该源码采用了Vue框架,JavaScript编程语言,以及HTML基础技术,结合Scss预处理器进行样式设计,使得整个系统的...

    _基于Bootstrap的响应式网页设计中断点研究.pdf

    Bootstrap是一个流行的前端框架,它允许开发者利用一系列预先设计好的CSS和JavaScript组件快速搭建响应式的网站布局。响应式网页设计是指网页可以自动适应不同屏幕尺寸和设备的特性,使得网站在手机、平板电脑以及...

    基于Vue框架的幼儿园后台管理系统设计源码

    基于Vue框架的幼儿园后台管理系统源码设计项目,是一个融合了现代Web技术的综合解决方案,专门针对幼儿园的日常管理工作。该项目采用了Vue.js作为主要的前端框架,利用其组件化和数据驱动的特点,实现了界面的动态...

    基于Vue框架的房屋租赁管理系统设计源码

    SCSS样式文件的存在表明了项目在样式方面的设计采用了预处理器,它使得CSS的编写更加模块化、可维护,并且可以使用变量、混合(mixin)等高级功能。 最后,系统中还可能使用了Map文件,这在JavaScript项目中通常...

    基于Vue、JavaScript、CSS、HTML的惠阳招商超市电商平台设计源码

    在文件架构方面,总数为576个文件的项目中,Vue组件文件占据了绝大多数,达到365个,这表明项目采用了组件化的设计理念,通过Vue的单文件组件(.vue文件)来构建用户界面,每个组件都包含了HTML模板、JavaScript逻辑...

    基于wepy框架的html+javascript小说阅读小程序设计源码

    基于wepy框架的HTML+JavaScript小说阅读小程序设计源码项目是一次结合现代前端技术与移动设备阅读体验的创新尝试。通过精心设计的源码结构与文件组织,该项目不仅提供了丰富的功能模块,同时也注重了代码的规范性与...

    基于Vue框架的场地预约微信小程序设计源码

    本项目“基于Vue框架的场地预约微信小程序设计源码”,以Vue.js为核心技术,实现了一个功能完备的场地预约系统,旨在满足各种场景下用户对场地预约的需求。 Vue.js是一个构建用户界面的渐进式框架,以其轻量、灵活...

Global site tag (gtag.js) - Google Analytics