1 创建Interceptor
php
@HMInterceptor({interceptorName: 'LoginCheckInterceptor'})
export class LoginCheckInterceptor implements IHMInterceptor {
handle(info: HMInterceptorInfo): HMInterceptorAction {
if(info.srcName === 'PayCard') {
if(!!AppStorage.get('isLogin')) {
return HMInterceptorAction.DO_NEXT;
} else {
info.context.getPromptAction().showToast({message: LoginConstants.LOGIN_TOAST});
HMRouterMgr.push({
pageUrl: 'loginPage',
skipAllInterceptor: true
});
return HMInterceptorAction.DO_REJECT;
}
} else {
if(!!AppStorage.get('isLogin')) {
return HMInterceptorAction.DO_NEXT;
} else {
info.context.getPromptAction().showToast({message: LoginConstants.LOGIN_TOAST});
HMRouterMgr.push({
pageUrl: 'loginPage',
param: info.targetName,
skipAllInterceptor: true
});
return HMInterceptorAction.DO_REJECT;
}
}
}
}
这个是官方demo里面的一个登陆拦截Interceptor。跳转某些需要登陆页面的时候,如果没有登陆返回 HMInterceptorAction.DO_REJECT,取消这次登陆。 如果已经登陆返回HMInterceptorAction.DO_NEXT,正常跳转。
2 使用 Interceptor
less
@HMRouter({
pageUrl: PageConstant.PAY_DIALOG_CONTENT,
dialog: true,
lifecycle: 'ExitPayDialog',
interceptors: ['LoginCheckInterceptor']
})
@Component
export struct PayDialogContent {}
在需要拦截的地方的interceptors中添加 比如
js
interceptors: ['LoginCheckInterceptor']
LoginCheckInterceptor 是创建Interceptor的时候填写的interceptorName @HMInterceptor({interceptorName: 'LoginCheckInterceptor'})
3 Interceptor的另一种注册方式
js
export class JumpInfoInterceptor implements IHMInterceptor {
handle(info: HMInterceptorInfo): HMInterceptorAction {
let connectionInfo: string = '';
if(info.type === HMActionType.PUSH) {
connectionInfo = 'jump to';
} else {
connectionInfo = 'back to';
}
console.log(`${info.srcName} ${connectionInfo} ${info.targetName}`);
return HMInterceptorAction.DO_NEXT;
}
}
JumpInfoInterceptor也是一个Interceptor,但是他并没有声明interceptorName。他可以通过这种方式注册。
css
HMRouterMgr.registerGlobalInterceptor({
interceptor: new JumpInfoInterceptor(),
interceptorName: 'JumpInfo',
priority: 5
});
4 全局 Interceptor
typescript
@HMInterceptor({interceptorName: 'LoginStatusInterceptor', global: true})
export class LoginStatusInterceptor implements IHMInterceptor {
handle(info: HMInterceptorInfo): HMInterceptorAction {
console.log(`Login status is ${!!AppStorage.get('isLogin') ? 'Y' : 'N'}`);
return HMInterceptorAction.DO_NEXT;
}
}
HMInterceptor 只是声明了global = true; 那么所有的页面跳转都会经过这个Interceptor。