HMRouter是HarmonyOS上页面跳转的场景解决方案,主要解决应用内原生页面间相互跳转的问题。本文主要以实际开发中的各项场景为例,介绍HMRouter路由框架的使用。HMRouter路由框架提供了下列功能特性:
该框架底层对Navigation相关能力进行了封装,帮助开发者减少对Navigation相关细节内容的关注、提高开发效率,同时该框架对页面跳转能力进行了增强,例如其中的路由拦截、单例页面等。下文以页面跳转、弹窗提示、转场动效、数据加载、维测场景为切入点,介绍HMRouter路由框架的使用。
HMRouter提供了基于自定义注解的页面跳转与返回功能,使用步骤如下:
@HMRouter({ pageUrl: 'ProductContent' })
@Component
export struct ProductContent {
// ...
}
HMRouterMgr.push({
navigationId: "mainNavigationId",
pageUrl: 'ProductContent',
param: { a: 1, b: 2 },
animator: new CustomAnimator(),
}, {
onResult(popInfo: HMPopInfo) {
const pageName = popInfo.srcPageInfo.name;
const params = popInfo.result;
console.log(`page name is ${pageName}, params is ${JSON.stringify(params)}`);
}
})
@Component
export struct ProductContent {
// ...
@State param: ParamsType | null = null;
aboutToAppear(): void {
this.param = HMRouterMgr.getCurrentParam() as ParamsType;
}
// ...
}
如需使用页面返回功能,在对应的业务逻辑位置使用HMRouterMgr提供的pop方法实现页面返回,同样的pop方法支持传入navigationId,同时HMRouter还支持在返回时通过配置param参数向其所返回的页面传递参数。
HMRouterMgr.pop({ navigationId: 'mainNavigationId', param: this.param })
当页面跳转路径如HomePage->PageA->PageB->PageC,开发者希望在PageC的页面逻辑中直接返回到HomePage并携带参数,开发者仅需使用HMRouterMgr提供的pop方法,传入要返回目标页面的pageUrl、传递的参数param,即可直接带参返回到指定页面。
HMRouterMgr.pop({ navigationId: 'mainNavigationId', pageUrl: 'HomePage', param: this.param })
图1 返回指定页面示意图
应用中经常会有当用户未登录应用时,点击某些应用内容会自动跳转到登录页面的场景,在使用HMRouter对此场景进行实现时,可以采用以下步骤:
定义拦截器类LoginCheckInterceptor实现IHMInterceptor接口。
为定义的拦截器类添加@HMInterceptor注解,通过interceptorName配置拦截器名称LoginCheckInterceptor。
实现IHMInterceptor的handle方法,在该方法中根据当前的登录状态来控制页面跳转的目标。
当用户已登录,通过返回HMInterceptorAction.DO_NEXT,正常执行后续页面跳转逻辑。
当用户未登录,通过Toast弹窗向用户提示登录,然后跳转到登录页面,最后通过HMInterceptorAction.DO_REJECT来拦截此次跳转请求。
@HMInterceptor({ interceptorName: 'LoginCheckInterceptor' })
export class LoginCheckInterceptor implements IHMInterceptor {
handle(info: HMInterceptorInfo): HMInterceptorAction {
// ...
if (!!AppStorage.get('isLogin')) {
return HMInterceptorAction.DO_NEXT;
} else {
info.context.getPromptAction().showToast({ message: '请先登录' })
HMRouterMgr.push({
pageUrl: 'loginPage',
param: info.targetName,
skipAllInterceptor: true
})
return HMInterceptorAction.DO_REJECT;
}
// ...
}
}
@HMRouter({
pageUrl: 'shoppingBag',
singleton: true,
interceptors: ['LoginCheckInterceptor'],
lifecycle: 'requestLifecycle'
})
@Component
export struct ShoppingBagContent {
// ...
}
运行效果如下图所示。