介绍
本示例介绍在Navigation中如何完成路由拦截:首次登录时记录登录状态,再次登录时可以直接访问主页无需重复登录,当退出登录时,下次需重新登录。
效果图预览
使用说明
- 点击Navigation路由拦截案例。
- 在弹出的半模态页面中勾选"阅读并同意协议",点击按钮"手机号码一键登录"。
- 进入主页,点击返回上级页面按钮,重新点击Navigation路由拦截案例,即可直接进入主页,不需要重复登录。
- 点击主页的"退出登录"按钮,退出案例,此时点击Navigation路由拦截案例需重新登录。
实现思路
1、在路由模块增加路由拦截器interceptor.ets,定义拦截容器、注册方法和公共拦截逻辑,interceptor.ets
/**
* 定义拦截实现接口
*
* @param routerInfo 需要拦截的路由名
* @param param 路由参数
*/
export interface InterceptorExecute {
executeFunction(router: RouterInfo, param?: string): boolean;
}
/**
* 定义拦截器方法
*/
export class Interceptor {
// 定义拦截器容器
private static list: Array<InterceptorExecute> = [];
/**
* 注册拦截页面
*
* @param interceptorFnc 子模块传过来的自定义拦截函数
*/
public static registerInterceptorPage(interceptorFnc: InterceptorExecute): void {
Interceptor.list.push(interceptorFnc);
}
/**
* 公共拦截器逻辑
*
* @param routerInfo 接收传过来的路由名
* @param param 路由参数
*/
public static interceptor(routerInfo: RouterInfo, param?: string): boolean {
// 循环拦截器容器中所有的子模块自定义的拦截函数
for (let i = 0; i < Interceptor.list.length; i++) {
if (Interceptor.list[i].executeFunction(routerInfo, param))
return true; // 如果子模块拦截函数返回true,即需要拦截
}
// 否则就放行
return false;
}
}
2、当点击本案例时,触发在路由模块的动态路由.push()中的interceptor的公共拦截方法(此处需动态路由完成加载后执行否则首次路由拦截失败)