【问题标题】:What is the difference between *ngIf and [hidden]?*ngIf 和 [hidden] 有什么区别?
【发布时间】:2021-03-19 00:23:56
【问题描述】:

说我对照和表达,那这两个不一样吗?

<div *ngIf="expression">{{val}}</div>

<div [hidden]="!expression">{{val}}</div>

【问题讨论】:

标签: angular


【解决方案1】:

它们之间实际上存在性能差异:

如果表达式为假,

ngIf 将注释掉数据。这样甚至不会加载数据,从而导致 HTML 加载速度更快。

[hidden] 将加载数据并用 hidden HTML 属性标记它们。即使数据不可见,也可以通过这种方式加载数据。

所以 [hidden] 在我们希望显示/隐藏状态频繁变化时使用更好,例如在按钮单击事件上,这样我们就不必每次按钮都加载数据被点击,只需改变它的 hidden 属性就足够了。

请注意,小数据可能看不到性能差异,只有大对象才能看到。

【讨论】:

  • 同意!在处理要经常渲染的较大数据时,不应考虑 ngIf。 ngIf 可以在页面特别大的情况下考虑,我们需要通过 API 调用什么的来渲染大数据。当我们只使用已经呈现的页面部分(如导航栏)时,隐藏属性会更快。
  • 图片在 ngIf 块内时​​差异更大。似乎在 Safari(iOS iphone)上,每次都可能重新加载图像,这大大降低了性能。因此,如果您可以在 ngIf 和隐藏之间进行选择,请选择隐藏。绝对。
【解决方案2】:

ngIf is a structural directive,它在 DOM 中创建/销毁内容。第二个语句只是用 css 隐藏/显示内容,即添加/删除 display:none 到元素的样式。

什么是结构指令?

结构指令负责 HTML 布局。他们塑造或 重塑 DOM 的结构,通常通过添加、删除或 操纵元素。


在第一种情况下,如果表达式是false 那么div 并且它的内容将不会被创建。在第二种情况下,div 和内容总是被创建,但如果表达式是 false,它们不可见

【讨论】:

    【解决方案3】:

    当您尝试操作包含在一个节中的结构中的元素时,它们之间实际上还有另一个区别:

    ngIf 如果您在为 false 时尝试引用该部分中的元素,则会导致代码中出现未定义的错误。

    [hidden] 如果您在该部分隐藏时尝试引用该部分中的元素,则不会导致代码中出现未定义错误。

    所以当我们想要对被包裹部分中的元素进行操作时,最好使用 [hidden]。

    【讨论】:

    • yulp,不能再同意了。
    • 这就是我找到这个答案的原因。我试图从外部搜索按钮引用带有模板引用(例如:#searchResults)的表。在没有找到结果的情况下尝试隐藏网格时,出现错误。隐藏是一个不错的选择,因为用户可能会多次搜索,直到找到他想要的东西,而且我总是能够从应该隐藏的元素范围之外引用东西。非常好。
    • 很高兴它帮助了你stackoverflow.com/users/692083/m%c3%a1rio-meyrelles -- 我必须时不时地回到这里提醒自己:-)
    【解决方案4】:

    *ngIf 如果为 false 将从 DOM 中删除元素

    如果为真则隐藏将在 css 中将显示设置为无

    【讨论】:

      【解决方案5】:

      另一个关键点,它可能会破坏 *ngIf 块内的 mat-paginator。例如

      .HTML

      <div *ngIf="myCondition">
          <mat-paginator #seeMe ...></mat-paginator>
      </div>
      

      .TS

      this.dataSource.paginator = this.seeMe;  // seeMe becomes underfined
      

      解决方案:

      【讨论】:

        【解决方案6】:
        如果分别设置为 true 和 false,

        *ngIf 将在 DOM 中包含和删除元素。 angular2 中的 [hidden] 相当于我们在 AngularJS 中的 ngshow 和 nghide。它只是通过添加 display:none 和 display:block 来显示和隐藏元素。

        【讨论】:

          【解决方案7】:

          场景 :--> 假设您正在使用 Behaviorsubject,它会发出布尔值“真/假”。

          案例 1 --> *ngIf --> 如果 Behaviorsubject 返回初始值 false,则该 DOM 将消失。并且即使它稍后发出真值,它也不会可见。

          案例 2 --> 隐藏 --> 它将根据 Behaviorsubject 发出的值完美运行。即它将切换 DOM。

          注意 - *ngIf 也会切换 DOM,但会在用户的操作或 DOM 事件上切换 ngIf 的值。

          【讨论】:

          • 本题中没有提到Behaviorsubject。
          猜你喜欢
          • 2015-09-15
          • 1970-01-01
          • 2012-06-10
          • 2017-04-11
          • 2022-12-18
          • 2017-09-19
          • 1970-01-01
          • 1970-01-01
          • 2010-10-02
          相关资源
          最近更新 更多