Ext架构分析(3)--Widget之父Component:render方法

简介: 首先,让我们回忆一下对于组件的讨论:   1.只有配置了applyTo或renderTo属性才会在构建组件时立刻进行render方法的调用;   2.如果是applyTo属性,则会对component的容器进行渲染;renderTo则是对component进行渲染;     现在,让我们看一下ren...
首先,让我们回忆一下对于组件的讨论:
  1.只有配置了applyTo或renderTo属性才会在构建组件时立刻进行render方法的调用;
  2.如果是applyTo属性,则会对component的容器进行渲染;renderTo则是对component进行渲染;
 
  现在,让我们看一下render方法的实现:
img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif render :  function (container, position) img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif
//如果还没有被渲染 并且beforerender方法返回值为true,则进行渲染,这样,确保了对于组件仅进行一次渲染; position参数指定了组件被插入容器的位置(即在position指定的元素前插入组件) 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(!this.rendered && this.fireEvent("beforerender"this!== false)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif
//没有传入任何参数(即未指定容器container)并且设置了this.el,增配置this.container属性 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(!container && this.el)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.el = Ext.get(this.el); 
img_33d02437d135341f0800e3d415312ae8.gif  container 
= this.el.dom.parentNode; 
img_33d02437d135341f0800e3d415312ae8.gif  
this.allowDomMove = false
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_33d02437d135341f0800e3d415312ae8.gif
this.container = Ext.get(container); 
img_33d02437d135341f0800e3d415312ae8.gif
//如果配置了ctCls,对container进行ctCls的渲染,ctCls(Container Class)是容器的渲染类名,cls(Class)是元素的渲染类名 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(this.ctCls)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.container.addClass(this.ctCls); 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_33d02437d135341f0800e3d415312ae8.gif
this.rendered = true
img_33d02437d135341f0800e3d415312ae8.gif
//设置position 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(position !== undefined)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif  
if(typeof position == 'number')img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  position 
= this.container.dom.childNodes[position]; 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif  }
elseimg_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  position 
= Ext.getDom(position); 
img_105a1e124122b2abcee4ea8e9f5108f3.gif  }
 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_33d02437d135341f0800e3d415312ae8.gif
//进行onRender方法调用 
img_33d02437d135341f0800e3d415312ae8.gif
this.onRender(this.container, position || null); 
img_33d02437d135341f0800e3d415312ae8.gif
//如果设置了autoShow,则移除x-hidden和x-hide-hideMode(根据hideMode该属性可以配置为display,visibility,offsets三种属性),从这个方法可以看出,一搬来说,组件创建后缺省的模式为hidden或者none
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(this.autoShow)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]); 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_33d02437d135341f0800e3d415312ae8.gif
//如果设置了cls,则对元素进行渲染 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(this.cls)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.el.addClass(this.cls); 
img_33d02437d135341f0800e3d415312ae8.gif  
delete this.cls; 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_33d02437d135341f0800e3d415312ae8.gif
//如果设置了style,则对元素Style属性进行设置 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(this.style)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.el.applyStyles(this.style); 
img_33d02437d135341f0800e3d415312ae8.gif  
delete this.style; 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_33d02437d135341f0800e3d415312ae8.gif
//触发fireEvent和AfterRender事件 
img_33d02437d135341f0800e3d415312ae8.gif
this.fireEvent("render"this); 
img_33d02437d135341f0800e3d415312ae8.gif
this.afterRender(this.container); 
img_33d02437d135341f0800e3d415312ae8.gif
//如果设置了hidden和disabled则进行相应的处理 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(this.hidden)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.hide(); 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(this.disabled)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.disable(); 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_33d02437d135341f0800e3d415312ae8.gif
this.initStateEvents(); 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_33d02437d135341f0800e3d415312ae8.gif
return this
img_05dd8d549cff04457a6366b0a7c9352a.gif}
 
img_a6339ee3e57d1d52bc7d02b338e15a60.gif


onRender实现的方法如下:
img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif onRender :  function (ct, position) img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif
//如果配置了autoEl属性,则根据autoEl属性生成el属性, 如果autoEl属性为字符串,则根据字符串生成元素;否则,则在autoEl指定的元素外包裹一层div元素 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(this.autoEl)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(typeof this.autoEl == 'string')img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
this.el = document.createElement(this.autoEl); 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif}
elseimg_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  
var div = document.createElement('div'); 
img_33d02437d135341f0800e3d415312ae8.gif  Ext.DomHelper.overwrite(div, 
this.autoEl); 
img_33d02437d135341f0800e3d415312ae8.gif  
this.el = div.firstChild; 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_33d02437d135341f0800e3d415312ae8.gif
//把position元素插入到el元素前 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(this.el)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif
this.el = Ext.get(this.el); 
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif
if(this.allowDomMove !== false)img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif
img_33d02437d135341f0800e3d415312ae8.gif  ct.dom.insertBefore(
this.el.dom, position); 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_105a1e124122b2abcee4ea8e9f5108f3.gif}
 
img_05dd8d549cff04457a6366b0a7c9352a.gif}
 
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
相关文章
|
人工智能 API 数据安全/隐私保护
Apifox 与 Apipost 的 API 文档引擎对比:底层架构、性能与可扩展性分析
深入探索市场上两大主流API工具——Apifox和Apipost的文档能力时,发现了令人惊讶的差距。这不仅仅是功能多寡的问题,更关乎开发效率与团队协作的质变。
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
650 102
|
12月前
|
Java API 开发工具
灵码产品演示:软件工程架构分析
本演示展示灵码对复杂软件项目的架构分析与文档生成能力。通过Qwen3模型,结合PlantUML,自动生成系统架构图、微服务时序图,并提取API接口文档,实现高效、智能的代码理解与文档输出。
668 5
|
12月前
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
机器学习/深度学习 人工智能 算法
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
该研究系统梳理了大型多模态推理模型(LMRMs)的技术发展,从早期模块化架构到统一的语言中心框架,提出原生LMRMs(N-LMRMs)的前沿概念。论文划分三个技术演进阶段及一个前瞻性范式,深入探讨关键挑战与评估基准,为构建复杂动态环境中的稳健AI系统提供理论框架。未来方向聚焦全模态泛化、深度推理与智能体行为,推动跨模态融合与自主交互能力的发展。
1153 13
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
|
存储 前端开发 JavaScript
如何开发设备管理系统中的经验分析报表板块 ?(附架构图+流程图+代码参考)
设备管理系统(EMS)助力企业高效管理设备生命周期,涵盖采购、维护到报废全流程。本文详解经验分析报表模块设计与开发,涵盖动态看板、点检、巡检、维修、保养及库存统计功能,提供代码示例与架构设计建议,提升设备管理效率与决策水平。
|
运维 监控 数据可视化
一文详解:工业软件“低代码开发平台”技术架构研究与分析
本文围绕工业软件低代码开发平台的机遇与挑战,提出基于自动化引擎的技术架构,由工具链、引擎库、模型库、组件库、工业数据网关和应用门户组成。文章分析了其在快速开发、传统系统升级中的应用模式及价值,如缩短创新周期、降低试错成本、解决资源缺乏和提升创新可复制性,为我国工业软件产业发展提供参考和支持。
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
1142 0
|
11月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路