代码拉取完成,页面将自动刷新
应用在加载页面时,如果引入大量暂不需要加载的模块,会因过多模块导致页面加载缓慢。比如当页面在使用Navigation组件时,主页默认先加载所有页面,此时若包含大量子页面,仅加载主页这一项就需要很长时间,但这些复杂的子页面与主页渲染无关。 本文推荐使用动态加载解决上述问题,不在应用程序加载时就将所有模块都加载进来,而是按需加载模块,增加应用灵活性,提升应用性能。
主页 | 子页面 |
---|---|
下面示例应用通过Navigation组件常规加载与动态加载的对比,介绍如何在跳转时触发加载方法,实现按需加载子模块。
开发者使用Navigation组件时,通常会在主页引入各子页面组件,在按钮中添加方法实现跳转。下述代码展示常规加载示例,通过import引入子组件。
import { pageOne, pageOneData } from './pageOne';
import { pageTwo, pagesTwoData } from './pageTwo';
...
import router from '@ohos.router';
@Provide('pathInfos') pageInfos: NavPathStack = new NavPathStack();
@Builder
PageMap(name: string) {
if (name === 'pageOne') {
pageOne(new pagesOneData(name, this.pageInfos));
} else if (name === 'pageTwo') {
pageTwo(new pagesTwoData(name, this.pageInfos));
}
...
}
build() {
Navigation(this.pageInfos) {
Button('返回', { stateEffect: true, type: ButtonType.Capsule })
.onClick(() => {
router.back();
})
Column() {
Button('pageOne', { stateEffect: true, type: ButtonType.Capsule })
.onClick(() => {
this.pageInfos.pushPath({ name: 'pageOne' }); // 将name指定的NavDestination页面信息入栈
})
Button('pageTwo', { stateEffect: true, type: ButtonType.Capsule })
.onClick(() => {
this.pageInfos.pushPath({ name: 'pageTwo' });
})
...
}
}.title('主页').navDestination(this.PageMap)
}
当子组件较多、较复杂时,由于Navigation组件一次性加载所有模块,使用常规加载会导致主页加载缓慢。为了减少主页渲染时间,可以使用动态加载,在实际页面跳转时再按需动态引入子组件,优化用户的首次加载速度体验。以下是动态加载实现步骤:
import { pageOne } from './pageOne';
@Builder
export function PageOneLoader() {
pageOne();
}
@BuilderParam PageOneLoader: () => void
,用来承接await import异步导入pageOneLoader的结果。
@BuilderParam PageOneLoader: () => void;
async loadPageOne(key: string){
if (key === "pageOne") {
let PageObj: ESObject = await import("../pages/PageOneLoader");
this.PageOneLoader = PageObj.PageOneLoader;
}
}
private onEntryClick(): void {
try {
this.loadPageOne('pageOne');
this.pageInfos.clear();
this.pageInfos.pushPathByName('pageOne', '');
logger.info('DynamicImport Success');
} catch (error) {
logger.info('DynamicImport Fail');
}
}
@Builder
PageMap(name: string) {
if (name === 'pageOne') {
this.PageOneLoader();
}
}
完整的DynamicHome主页代码如下:
import router from '@ohos.router';
import { logger } from '../../ets/utils/Logger';
@Entry
@Component
struct DynamicHome {
@Provide('pathInfos') pageInfos: NavPathStack = new NavPathStack();
@State active: boolean = false;
@BuilderParam PageOneLoader: () => void;
@Builder
PageMap(name: string) {
if (name === 'pageOne') {
this.PageOneLoader();
}
}
build() {
Navigation(this.pageInfos) {
Column() {
Button('返回', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
router.back();
})
Button('PageOne-动态', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.onEntryClick();
})
}
}.title('HOME').navDestination(this.PageMap)
}
async loadPageOne(key: String) {
if (key === "pageOne") {
let PageObj: ESObject = await import("../pages/PageOneLoader");
this.PageOneLoader = PageObj.PageOneLoader;
}
}
// 触发动态加载
private onEntryClick(): void {
try {
this.loadPageOne('pageOne');
this.pageInfos.clear();
this.pageInfos.pushPathByName('pageOne', '');
logger.info('DynamicImport Success');
} catch (error) {
logger.info('DynamicImport Fail');
}
}
}
当子页面逐渐增多时,Navigation组件使用常规加载会因默认加载所有子页面导致性能开销增大,主页内存占用增加,加载时间变长。此时改用动态加载不再提前加载子页面,可以有效地避免这些任务阻塞主线程,从而降低整体资源消耗,提高主页的加载速度。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。