我已经创建了一个简单的网页(模板)组件AuthGuard,不要被混淆与角的AuthGuard。
此组件的目的是检查用户是否已登录。
如果是
。
组件代码如下:
import { Component, Host, h } from '@stencil/core';
import { Build, State } from '@stencil/core';
import { AuthService } from 'auth/auth.service';
import { ConfigService } from 'common/config.service';
@Component({
tag : 'auth-guard',
styleUrl : 'auth-guard.css',
shadow : true,
})
export class AuthGuard {
@State() canRender : boolean = false;
componentWillLoad() {
if (Build.isBrowser) {
const timerId = setInterval(() => {
if (AuthService.isInitialized) {
AuthService.vol$.subscribe(_u => {
this.canRender= true;
});
clearInterval(timerId);
}
}, ConfigService.loadTime);
}
}
render() {
console.log('auth guard :: render', this.canRender, AuthService.me);
return (
<Host>
{
this.canRender ? (
AuthService.me && AuthService.me.id.length > 0 ? (
<slot></slot>
) : (
<ion-button
href="/signup"
routerDirection="forward"
color="danger">
Signup
</ion-button>
)
): null
}
</Host>
);
}
}现在,在另一个文件中,我使用以下代码:
<auth-guard slot='end'>
<volunteer-mini volunteer={AuthService.me}></volunteer-mini>
</auth-guard>有了这个我期待的是
this.canRender变为真为止。但是,当this.canRender为false时,它试图将volunteer-mini呈现为槽HTML,这是一个问题。因为volunteer-mini在内部依赖于尚未初始化的AuthService.me。
但是一旦this.canRender成为现实,其他两种方案就可以正常工作了。
发布于 2020-04-26 17:51:03
一般来说,用模具写护栏是个坏主意。核心问题是,在组件初始化之前就存在插槽。
因此,使用当前代码,在决定没有权限之后,必须手动删除插槽。
此外,如果您没有定义插槽位置,但仍然在您的父级中提供插槽内容,则它仍将被附加到您的内部子项中。
要解决这个问题,可以将组件重构为像<Host>这样的函数,但这还需要考虑其他问题。
https://stackoverflow.com/questions/61444770
复制相似问题