指令

指令是 Angular 提供的操作 DOM 的途径。指令分为属性指令和结构指令。

属性指令:修改现有元素的外观或行为,selector 使用 [] 包裹。

结构指令:增加、删除 DOM 节点以修改布局,使用 * 作为指令前缀。

内置指令

*ngIf

根据条件渲染 DOM 节点或移除 DOM 节点。

<div *ngIf="data.length == 0">没有更多数据</div>
<div *ngIf="data.length > 0; then dataList else noData"></div>
<ng-template #dataList>课程列表</ng-template>
<ng-template #noData>没有更多数据</ng-template>

[hidden]

根据条件显示 DOM 节点或隐藏 DOM 节点。

<div [hidden]="data.length == 0">课程列表</div>
<div [hidden]="data.length > 0">没有更多数据</div>

*ngFor

遍历数据生成HTML结构

interface List {
  id: number
  name: string
  age: number
}

list: List[] = [
  { id: 1, name: "张三", age: 20 },
  { id: 2, name: "李四", age: 30 }
]
<li
    *ngFor="
      let item of list;
      let i = index; // 下标
      let isEven = even; // 是否是第偶数个元素
      let isOdd = odd; // 是否是第奇数个元素
      let isFirst = first; // 是否是第一个元素
      let isLast = last; // 是否是最后一个元素
    "
  >
  </li>

trackBy

在 Angular 中遍历数组时,会用到 ngFor 指令,如果数组中的数据改变了(新数组替换旧数组),Angular 会删除与数据关联的所有 DOM 元素,然后再次创建它们。这意味着将有很多 DOM 操作。

使用 *ngFortrackBy 属性,Angular 可以仅更改和重新渲染那些已更改的条目,而不是重新加载整个条目列表。

trackByItems(index: number, item: Item): number {
    return item.id; // 只需要返回一个唯一标识就好了
}
<div *ngFor="let item of items; trackBy: trackByItems">
    ({{ item.id }}) {{ item.name }}
</div>

使用 trackBy 的好处是自定义返回跟踪结果,以比对上次的跟踪结果,如果不一样,那么就刷新变化的页面实例(减少不必要的 Dom 刷新而带来性能的提升)。

自定义指令

需求:为元素设置默认背景颜色,鼠标移入时的背景颜色以及移出时的背景颜色。

<div [appHover]="{ bgColor: 'skyblue' }">Hello Angular</div>
import { AfterViewInit, Directive, ElementRef, HostListener, Input } from "@angular/core"

// 接收参的数类型
interface Options {
  bgColor?: string
}

@Directive({
  selector: "[appHover]"
})
export class HoverDirective implements AfterViewInit {
  // 接收参数
  @Input("appHover") appHover: Options = {}
  // 要操作的 DOM 节点
  element: HTMLElement
	// 获取要操作的 DOM 节点
  constructor(private elementRef: ElementRef) {
    this.element = this.elementRef.nativeElement
  }
	// 组件模板初始完成后设置元素的背景颜色
  ngAfterViewInit() {
    this.element.style.backgroundColor = this.appHover.bgColor || "skyblue"
  }
	// 为元素添加鼠标移入事件
  @HostListener("mouseenter") enter() {
    this.element.style.backgroundColor = "pink"
  }
	// 为元素添加鼠标移出事件
  @HostListener("mouseleave") leave() {
    this.element.style.backgroundColor = "skyblue"
  }
}
最后更新于