【问题标题】:How to prevent flickering when using *ngIf?使用 *ngIf 时如何防止闪烁?
【发布时间】:2020-05-07 14:31:17
【问题描述】:

在我的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 中,标题应该是不可见的。

现在发生的情况是,有短暂的闪烁(似乎在您登录然后注销并返回登录页面时发生),其中标题在隐藏之前是可见的(是的,也会抛出 @987654325 @)。

实现这一目标的最佳方法是什么?我应该默认将showHeader 设置为false 吗?

login.component.ts

export class LoginComponent implements OnInit {

  ngOnInit() {
       // To hide the header
       this.HeaderService.setToggleState(false);
  }
}

【问题讨论】:

    标签: html angular angular8


    【解决方案1】:

    你可以简单地添加

    ngOnDestroy(){
        this.service.setToggleState(true);
      }
    

    在登录组件中。 您可以在服务中将默认值设置为 true。然后当您不需要显示组件的标题时,然后将 ngoninit 设置为 false 并将 ngondestroy 设置为 true 以避免闪烁。

    请参阅此处,例如 https://stackblitz.com/edit/angular-krit8a

    【讨论】:

      【解决方案2】:

      当你使用*ngIf时,该元素不在DOM中(如果条件为false),将在运行时放入DOM中。

      相反,您可以使用[hidden]="&lt;your condition&gt;",因为即使条件为false,您的元素也会出现在DOM 中。如果此时您的条件更改为true,则元素的opacity 将从0 更改为1,从而使元素可见。

      现在,为了获得更平滑的过渡,您可以像这样在 DOM 元素上添加一些 CSS:

      .your-element {
          transition: visibility 0.5s;
      }
      

      这样你就可以得到类似悬停的效果。

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

      希望有帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 2014-01-06
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        相关资源
        最近更新 更多