`
lorry1113
  • 浏览: 262411 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ext源码分析之模板模式解说——Ext组件渲染render的全过程详述

    博客分类:
  • ext
阅读更多
模板模式是设计模式中很重要的一个知识点,我在模式总结——模板方法这篇文章中已有总结,在面向对象设计中有着举足轻重的地位。

在Ext中更是发挥的淋漓尽致,为什么这么说呢?Ext中的组件有着很深的继承关系,很多方法都有着重复,而且不仅
是代码上的重复,更多的是流程上的重复
比方说,Ext.Panel吧,将一个Panel显示在浏览器中,其过程叫做render(渲染)。有这么几道工序:
第一、触发”beforeRender”事件
第二、得到这个Panel的父节点(针对DOM来说),即容器,也就是供Panel入住的那个容器
第三、设置rendered=true
第四、调用onRender方法,这步是最重要的,也就是如何将组件显示在浏览器上,涉及到很多流程,一会详解
第五、设置这个panel的css
第六、触发”render”事件,指的是当render完成后,触发的事件
第七、调用aferRender,这步和第四步一样,是很重要的流程之一
第八、看看要不要将这个panel隐藏或者失效,如果用户设置了hidden或者disable
第九、设置这个panel的位置,也就是doLayout,布局

再来,Ext.Panel的子类,Ext.TabPanel,也有这么几道工序:
第一、触发”beforeRender”事件
第二、得到这个Panel的父节点(针对DOM来说),即容器,也就是供Panel入住的那个容器
第三、设置rendered=true
第四、调用onRender方法,这步是最重要的,也就是如何将组件显示在浏览器上,涉及到很多流程,一会详解
第五、设置这个panel的css
第六、触发”render”事件,指的是当render完成后,触发的事件
第七、调用aferRender,这步和第四步一样,是很重要的流程之一
第八、看看要不要将这个panel隐藏或者失效,如果用户设置了hidden或者disable
第九、设置这个panel的位置,也就是doLayout,布局
第十、设置activeTab,也就是激活哪个Tab面板

仅仅多了第十个步骤。

其他例子不举了,都是仅仅在最后几个步骤上不同而已,大家要说了,这个那是什么模板模式,不就是最简单的继承吗?
错了,继承指的是属性和方法的继承,但现在是一个流程,一个系列的工序”继承”,这就是模板模式了。

我们来看,应用了模板模式后的工序

Ext.TabPanel只有2道工序了
第一、完成Panel渲染的工序
第二、设置activeTab,也就是激活哪个Tab面板

Ext.Panel一道工序
第一、完成Ext.Container的渲染工序

Ext.Container有2道工序
第一、完成BoxComponent的渲染工序
第二、设置这个panel的位置,也就是doLayout,布局

Ext.BoxComponent一道工序
第一、完成Ext.Component的渲染工序

Ext.Component八道工序
第一、触发”beforeRender”事件
第二、得到这个Panel的父节点(针对DOM来说),即容器,也就是供Panel入住的那个容器
第三、设置rendered=true
第四、调用onRender方法,这步是最重要的,也就是如何将组件显示在浏览器上,涉及到很多流程,一会详解
第五、设置这个panel的css
第六、触发”render”事件,指的是当render完成后,触发的事件
第七、调用aferRender,这步和第四步一样,是很重要的流程之一
第八、看看要不要将这个panel隐藏或者失效,如果用户设置了hidden或者disable

下面把流程图展示出来(配合上onRender和afterRender)

我们来看下图





那么在Ext是如何让这些流程在不同类之间自由跳转的呢?这就是大名鼎鼎的call和apply在起着重要作用了
比如我们来看如下代码
Ext.Panel.superclass.onRender.call(this, ct, position);
什么意思?this就是panel的意思,Ext.Panel.superclass就是Ext.Container,这句代码的意思就是“panel,你给我去执行container里面的onRender方法”
那么在Ext.Container的onRender方法有存在着
Ext.Container.superclass.onRender.call(this, ct, position);
这样的代码,这里的this还是指panel,不懂看上图,这里所有的this统统指panel对象,记住!意思是“panel,你再给我执行container父类里面的onRender方法”
接着又会出现“panel,你再给我执行container父类的父类里面的onRender方法”,一层层递归下去了,呵呵

仔细的朋友去看container的时候会发现没有onRender方法,不错,代码里确实没有,但是执行起来之后就有了,不懂?看我的
Ext源码分析源码分析之Ext的继承模式解说
分享到:
评论

相关推荐

    vue props传入render函数,实现动态组件嵌套

    在Vue.js框架中,`props`是父组件向子组件传递数据的一种机制,而`render`函数则是Vue中用于自定义渲染逻辑的关键工具。本文将深入探讨如何利用`props`和`render`函数来实现组件之间的动态嵌套,从而提高应用的灵活...

    WPF渲染Render范例C#代码

    在这个“WPF渲染Render范例C#代码”中,我们将探讨如何通过C#代码控制WPF的渲染过程。 首先,渲染过程在WPF中是由`Visual`类及其子类驱动的,它们负责描述UI元素的几何形状、颜色和透明度等特性。每个WPF控件都是一...

    Ext Panel拼揍表格模板.rar

    Ext Panel是Ext JS框架中的一个核心组件,常用于构建复杂的用户界面,特别是在数据展示和交互方面。本资源“Ext Panel拼揍表格模板.rar”显然包含了关于如何使用Ext Panel创建自定义表格模板的示例和代码。 Ext JS...

    Ext表单组件之textField

    本篇我们主要关注"Ext表单组件之textField",它是最基础也是最常用的输入控件,用于接收用户的文本输入。 一、Ext.form.TextField简介 Ext.form.TextField是Ext JS中的一个核心组件,它允许用户在表单中输入单行...

    Vue组件用于Vue组件的延迟渲染

    2. **Vue.LazyRender 插件**:从提供的压缩包文件名 "vue-lazy-render-master" 看,这可能是一个专门用于延迟渲染的 Vue 插件。使用此类插件,我们可以更方便地管理哪些组件应该被延迟加载。具体使用方法可能包括在...

    react-一个React的YouTube播放器组件遵循renderprops模式

    本项目“react-一个React的YouTube播放器组件遵循renderprops模式”正是基于这种模式创建的,旨在提供一个功能完备的YouTube视频播放器组件,供开发者在自己的应用中方便地集成。 Render Props(渲染属性)是一种...

    vue+render 实现 动态加载组件 后面会用来做运营活动模板组件

    `vue+render`结合使用可以创建高度定制化的运营活动模板组件,使得开发者能够快速响应业务需求,构建出丰富的用户界面。 首先,我们要理解Vue的`render`函数。`render`函数是Vue实例的一个选项,它允许我们以...

    element-ui table组件如何使用render属性的实现

    主要介绍了element-ui table组件如何使用render属性的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    一个渲染框架render frame

    渲染框架Render Frame是一个专用于图形图像处理的软件开发工具,其核心目标是为开发者提供一套高效、灵活且可扩展的机制来创建和管理渲染过程。在计算机图形学领域,渲染是将几何数据、光照信息、纹理等转换为二维...

    Openlayers扩展插件ol-ext ,2022年4月版本v3.2.23

    6. **地理分析**:ol-ext提供了基本的地理分析功能,比如缓冲区分析、叠加分析等,这为开发地理信息系统(GIS)提供了更多可能性。 7. **高性能渲染**:优化了图层的渲染性能,尤其在处理大量数据时,ol-ext能够更...

    Ext 3.0 中文文档.zip

    Grid的灵活性在于可以通过配置定义列的类型和行为,如使用模板渲染单元格内容,或者添加自定义的编辑器。 五、Form:Ext的Form组件提供了丰富的表单元素和验证机制,支持多种输入类型和布局。表单可以绑定到Model,...

    Ext_Designer生成代码的使用

    Ext Designer不仅简化了Ext JS组件的创建过程,还提高了开发效率,特别是对于那些不熟悉Ext JS API的开发者而言。通过使用Ext Designer,开发者可以专注于设计和布局,而将生成复杂代码的任务交给工具来完成。不过,...

    jQuery模板 :(二) JSRender之内置的模板标签

    **jQuery 模板:JSRender 内置的模板标签** 在Web开发中,模板引擎是一种强大的工具,它允许我们分离数据和视图,使代码更易于维护和扩展。jQuery的一个扩展,JSRender,是一个轻量级但功能强大的模板库,提供了...

    Ext 将grid渲染到combox

    当 `ComboBox` 展开时,监听器中的 `'expand'` 事件会被触发,此时会调用 `Ext.getCmp("qualityAgreeGrid").render("qualityAgreeGrid")`,即根据指定的 `id` 获取对应的组件并进行渲染。 4. **理解必要属性** ...

    Ext常用属性总结

    3. **renderTo** - 指定组件应渲染到哪个DOM元素。如果没有设置,组件会被添加到最近的父容器中。 4. **width** 和 **height** - 设置组件的尺寸。可以是具体的像素值,也可以是百分比。 5. **flex** - 在布局管理...

    Chrome谷歌浏览器源码分析

    Chrome谷歌浏览器源码分析 Chrome浏览器是全球最受欢迎的网络浏览器之一,其强大的性能、安全性和易用性得益于其先进的设计理念和高效的技术实现。本篇将深入探讨Chrome的核心组件——渲染引擎(Rendering Engine)...

    Ext2.1API中文文档

    例如,`Ext.Component`是所有UI组件的基类,它的`initComponent`方法是初始化组件的关键步骤,而`render`方法负责将组件渲染到页面上。开发者可以通过扩展或配置这些基础类来创建自定义组件。 标签“源码”意味着...

    EXT中文教程121212

    通过配置对象,可以定制组件的外观和行为,然后使用renderTo属性将其渲染到指定的DOM元素上。 使用Ajax: EXT内置了Ajax通信模块,提供了简单易用的API进行异步数据交换。例如,使用Ext.Ajax.request()方法可以发起...

Global site tag (gtag.js) - Google Analytics