安卓开发者自学鸿蒙开发2页面高级技巧
基于uiAbility最新的Stage 模型,旧版本的FA不再讨论
UIAbility 和 page
UIAbility是系统调度的基础单元,相当于独立的应用窗口
page是UIAbility内部的视图容器,通过路由机制实现跳转
一个 UIAbility 可托管多个 Page(类似单 Activity 多 Fragment)
UIAbility生命周期有onCreate/onDestroy等
建议将独立功能模块封装为UIAbility,通过多Page实现功能内页面流转
Stage模型允许在单个Module内定义多个UIAbility,适用于需要独立窗口或功能的场景(如支付应用中同时存在入口功能和收付款功能)
每个UIAbility运行在单独的进程中
启动UIAbility时通过startAbility或startAbilityForResult传递参数,这与安卓的activity启动方式一致的.安卓的页面就是一个activity,他作为最终的页面单位,但是鸿蒙系统中UIAbility里面可以有很多page组件,这些page作为最终的页面容器,UIAbility更像是安卓activity里面的window对象
所有 Page 需在 module.json5中注册
这没什么说的,安卓,vue项目等,几乎所有的类似项目都需要注册,包括 name、label和 actions
生命周期只有四个方法,安卓有6个
aboutToAppear() 页面即将显示
onPageShow()页面完全显示
onPageHide()页面完全不可见(不会因半屏弹窗或局部遮挡触发)
aboutToDisappear()页面即将不可见
数据加载建议:
aboutToAppear() 加载,但要判断是否需要加载,一些不必要实时刷新的数据,可以判断如果加载完成了就不需要再次加载了,当然,所有的网络加载都建议使用异步加载
页面消失前取消加载,可以在aboutToDisappear()里面
注意:build()里面不要加载数据
而应该像vue.js里面提供数据加载的结构体方法,在结构体方法里面去加载.build()里面全部处理ui相关的事务.build就像安卓的xml布局文件一样用就行了.官方推荐的方式,我们也应该区分开,让代码更加整洁,同时官方的说法是性能更高
页面跳转控制
新版路由 API 核心方法
跳转到新页面,保留当前页面(压栈)router.push({ url: ‘pages/DetailPage’ })
替换当前页面,销毁原页面(无法返回)router.replace({ url: ‘pages/LoginPage’ })
返回上一页(可传参)router.back({ url: ‘pages/HomePage’ })
清空页面栈并跳转到指定页面router.clear({ url: ‘pages/HomePage’ })
// 跳转时传参(参数直接合并到配置对象)
router.push({
url: 'pages/DetailPage',
params: {
id: 123,
mode: 'single' // 指定路由模式(single/standard)这个特殊的key必须注意一下
}
});
// 目标页面获取参数
aboutToAppear() {
const params = router.getParams(); // { id: 123, mode: 'single' }
const id = Number(params.id||0; //安全健壮的写法
}
// 全局前置守卫
router.addBeforeHook((to, from, next) => {
if (to.url === Routes.Detail && !isLogin) {
next({ url: Routes.Login }); // 重定向
} else {
next();
}
});
//监听路由变化
router.addObserver((to, from) => {
console.log(`从 ${from?.url} 跳转到 ${to.url}`);
});
启动模式
与安卓的4种不同,只有2种标准启动模式还有一种自定义
singleton->单例模式
multiton ->对应安卓标准模式
specified->自定义逻辑,通过 AbilityStage.onAcceptWant()动态决定实例复用或新建,需开发者自定义逻辑,这个就不展开研究了
更多推荐

所有评论(0)