Ext下多tab的延迟加载问题

本文介绍了一种在ExtJS框架中实现Tab面板懒加载的方法,通过推迟非活动Tab的加载来提高应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明 : 名称或许跟我实际要说的不一致.我只是这么理解的而已.

有时候在ext开发框架下,我们会用到多tab的情况.但很多时候我发现(包括我之前)都是这么写的:

Var tabPanel = Ext.create(‘Ext.tab.Panel’,{

         Items:[{

                   title: ’tab1’

},{

   title : ’tab2’

}//…. 等等很多的页面

]

});

假如每个tab里包含大量的请求的话,那么这么做在第一次加载时恐怕会变的相当的耗费时间.(我假设场景是多请求以及数据量较大的情况),当然我们可以通过设计来屏蔽这种场景的出现.但并非我讨论范围内.

那么我们如何解决这类问题呢? //注:这种办法原解决人为我前一公司同事,当时我俩讨论的结果.不过这里我重新做了一套,思路同之前.并且没有优化.

Ext.define(‘Ext.ux.tab.switchTabPanel',{

            extend:'Ext.tab.Panel',

            tabItems:[],

            border:false,

            getCurrentPanel:function(){

                            returnthis.tabItemMap[this.activeTab.name].inited;

            },

            getComponetByName:function(name){

                            vartabItemMap = this.tabItemMap;

                            if(tabItemMap[name]){

                                     if(tabItemMap[name].inited){

                                               returntabItemMap[name].inited;

                                     }else{

                                               throw'名称为:'+name+'的tab页面shang未初始化!'

                                     }

                            }else{

                                     throw'名称为:'+name+'的tab页面不存在!';

                            }

            },

            initComponent:function(){

                            varme = this,tabItems = this.tabItems,items = [],tabItemMap = this.tabItemMap ={},obj = null,num = 0,name = null;

                            for(vari=0,len = tabItems.length;i<len;i++){

                                     obj= {

                                               name:tabItems[i]['name'],

                                               title:tabItems[i]['title'],

                                               layout:'fit',

                                               xtype:’container’,

                                               border:false

                                     };

                                     if(tabItems[i]['init']==true){

                                               num= i;

                                               name= tabItems[i]['name'];

                                     }

                                     tabItemMap[tabItems[i]['name']]= tabItems[i];

                                     items.push(obj);

                            }

                            if(name== null){

                                     name= tabItems[0]['name'];//如果未指定初始的面板,则默认第一个

                            }

                            this.items = items;

                            this.activeTab= num;

                            this.callParent(arguments);

                            this.on({

                                     beforerender:function(tabPanel){

                                               varnewCard = tabPanel.getComponent(num);

                                               varpanel = tabItemMap[name];

                                               varcom = panel.createCom();

                                               tabItemMap[name].inited= com;//标记该页面已经初始化

                                               deletepanel.title;

                                               newCard.add(com);

                                     },

                                     beforetabchange:function(tabPanel,newCard,oldCard,eOpts){

                                               if(!tabItemMap[newCard['name']].inited){//如果没初始化过

                                                        varpanel = tabItemMap[newCard.name];

                                                        var com =  panel.createCom();

                                                        tabItemMap[newCard.name].inited= com;

                                                        deletepanel.title;

                                                        newCard.add(com);

                                               }

                                     }

                            });    

            }

         });

上述代码基本上还没做优化,暂时就这样.它解决的思路是:

        根据tabItems的配置. 在原生tabPanel组件基础之上,生成了多个“假”的tab页面(此时尚未初始化每个tab里的组件或其他对象).在切换tab页前才对改tab页面里的真实数据或组件这些东西进行初始加载。

其使用方式(保证name唯一性,当然属性名可自己定制):

使用样例:

var panel = Ext.create(' Ext.ux.tab.switchTabPanel ',{

                             tabItems:[{

                                      name:'1',

                                      title:'XXXX',

                                      createCom:function(){

                                                  returnExt.create('Ext.panel.Panel',{

                                                            html:'XXX'

                                                  });

                                      }

                             },{

                                      name:'2',

                                      title:'aaa',

                                      createCom:function(){

                                                  returnExt.create('Ext.panel.Panel',{

                                                            html:'AAAA'

                                                  });

                                      }

                             },{

                                      name:'3',

                                      title:'CCCCC',

                                      init:true,

                                      createCom:function(){

                                                  returnExt.create('Ext.panel.Panel',{

                                                            html:'CCCC'

                                                  });

                                      }

                             }]

                   });

--请尊重原创!如有转载请标注转载地址! 
--改文的资源同步上传到我的资源中,供免费下载


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值