为啥在页面渲染过程中会多次调用 [ngStyle]?

Posted

技术标签:

【中文标题】为啥在页面渲染过程中会多次调用 [ngStyle]?【英文标题】:Why [ngStyle] is called many times during page rendering?为什么在页面渲染过程中会多次调用 [ngStyle]? 【发布时间】:2021-06-19 22:19:28 【问题描述】:

我有一个使用 [ngStyle] = "getStyle()" 的 Angular 页面,当我运行该页面时,似乎 getStyle() 已被多次调用。 谁能解释为什么会发生这种行为?

模板:

  <div class="toast" data-autohide="false" [ngStyle]="getStyle()">
    <div class="toast-header">
      <strong class="mr-auto text-primary">comment.username</strong>
      <small class="text-muted">5 mins ago</small>
    </div>
    <div class="toast-body">
      comment.comment
    </div>
  </div>

TS 代码:

  getStyle(): Object 

    this.x = Math.floor((Math.random() * 100));
    this.y = Math.floor((Math.random() * 30));

    console.log('random process ', this.x, this.y);
    
    return 
      left: this.x+'px',
      top: this.y+'px'
    ;

在浏览器控制台打印的日志:

【问题讨论】:

【参考方案1】:

如果您使用默认的变更检测策略,绑定到属性和指令的函数将在每个变更检测周期中被调用。像 getStyle() 这样的插值函数也是如此。

您需要在控制器中运行一次函数,将其结果保存在变量中,并将属性绑定到它。

控制器

export class SomeComponent 
  style: any;

  ngOnInit() 
    this.style = this.getStyle();
  

  getStyle(): Object 
    this.x = Math.floor((Math.random() * 100));
    this.y = Math.floor((Math.random() * 30));

    console.log('random process ', this.x, this.y);
    
    return 
      left: this.x + 'px',
      top: this.y + 'px'
    ;
  

模板

<div class="toast" data-autohide="false" [ngStyle]="style">
  ...
</div>

【讨论】:

以上是关于为啥在页面渲染过程中会多次调用 [ngStyle]?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 componentDidMount 在 react.js 和 redux 中被多次调用?

为啥挂载在 Vue 插件或 Mixin 中会工作多次? [关闭]

为啥在初始页面加载时多次调用 React Ref 回调(作为箭头函数或内联函数)?

为啥将 ngStyle 指令声明到 [] 中?

为啥 redux 多次初始化

无法使用[ngStyle]渲染从API接收的样式