html - 使用*ngIf时如何防止闪烁?

标签 html angular angular8

在我的 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 )。

实现这一目标的最佳方法是什么?我应该设置 showHeaderfalse默认情况下?

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;
}

通过这种方式,您可以获得类似悬停的效果。

另外,对于您的第二个问题(在数据存在之前标题的短暂闪烁):这可以解释为您初始化 showHeadertrue .所以一开始就出现了,然后在服务初始化的时候突然消失了。
所以在这种情况下,只需将其设置为 false在初始化。

希望有帮助:)

关于html - 使用*ngIf时如何防止闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59842641/

相关文章:

angular - ngIf 仅在 ngFor 的一个部分中列出

javascript - Angular 8 组件更改和 ngOnInit 调用

javascript - 我如何制作页面,每个页面包含 10 个帖子?

angular - toLowerCase 在类型上不存在。 typescript

jquery - :hover issue when mouse moves over an iframe which is inside the div | Internet Explorer

angular - 在 Angular 中动态设置宿主元素样式的两种方法之间的区别

html - 当侧边栏折叠为图标时,导航栏文本会溢出

angular - Ionic 4 Angular 8-未捕获的ReferenceError : global is not defined

javascript - 如何设置高度 :0?

javascript - 通过模板和占位符动态生成 CSS