在我的 app.component.html :
<html>
<head></head>
<body>
<header *ngIf="loggedIn && showHeader"></header>
<router-outlet></router-outlet>
</body>
</html>
在我的 app.component.ts :
export class AppComponent {
constructor(private HeaderService: HeaderService, private AuthService: AuthService) { }
get loggedIn(): boolean { return this.AuthService.getUserState(); }
get showHeader(): boolean { return this.HeaderService.getToggleState(); }
}
在我的 header.service.ts :
我们创建此服务是因为登录后还有其他特定组件需要隐藏标题。
@Injectable({
providedIn: 'root'
})
export class HeaderService {
showHeader = true;
constructor() { }
setToggleState(state: boolean) {
this.showHeader = state;
}
getToggleState() { return this.showHeader; }
}
现在,在我的
login.component
中,标题应该是不可见的。现在发生的事情是,有短暂的闪烁(似乎发生在您登录然后注销并返回登录页面时),其中标题在隐藏之前可见(是的,也会抛出
ExpressionChangedAfterItHasBeenCheckedError
)。实现这一目标的最佳方法是什么?我应该设置
showHeader
至 false
默认情况下?login.component.ts
export class LoginComponent implements OnInit {
ngOnInit() {
// To hide the header
this.HeaderService.setToggleState(false);
}
}
最佳答案
当您使用 *ngIf
,该元素不在 DOM 中(如果条件为 false
),将在运行时放入 DOM 中。
相反,您可以使用 [hidden]="<your condition>"
,因为即使条件是 false
,您的元素也会出现在 DOM 中。 .如果那么您的条件更改为 true
, 元素的 opacity
将从 0
更改至 1
,这使元素可见。
现在,为了获得更平滑的过渡,您可以像这样在 DOM 元素上放置一些 CSS:
.your-element {
transition: visibility 0.5s;
}
通过这种方式,您可以获得类似悬停的效果。
另外,对于您的第二个问题(在数据存在之前标题的短暂闪烁):这可以解释为您初始化
showHeader
与 true
.所以一开始就出现了,然后在服务初始化的时候突然消失了。所以在这种情况下,只需将其设置为
false
在初始化。希望有帮助:)
关于html - 使用*ngIf时如何防止闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59842641/