Skip to content

Angular 基础

使用 tutorials,一边学一边记笔记。

组件

tsx
import {Component} from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    Hello
  `,
  styles: `
    :host {
      color: blue;
    }
  `,
  standalone: true,
})
export class AppComponent {}

组合组件

tsx
import {Component} from '@angular/core';

@Component({
  selector: 'app-user',
  template: `
    Username: {{ username }}
  `,
  standalone: true,
})
export class UserComponent {
  username = 'youngTech';
}

@Component({
  selector: 'app-root',
  template: `<app-user />`,     // 2. 引入后使用
  standalone: true,
  imports: [UserComponent],     // 1. 引入其它组件
})
export class AppComponent {}

控制流 @if

tsx
import {Component} from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    @if(isServerRunning) {
      <span>Yes, the server is running</span>
    }
    @else {
      <span>No, it was dead.</span>
    }
  `,
  standalone: true,
})
export class AppComponent {
  // add the boolean property here
  isServerRunning: boolean = true
}

控制流 @for

tsx
import {Component} from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    @for(user of users; track user.id) {
      <p>{{ user.name }}</p>
    }
  `,
  standalone: true,
})
export class AppComponent {
  users: any[] = [
    {id: 0, name: 'Sarah'},
    {id: 1, name: 'Amy'},
    {id: 2, name: 'Rachel'},
    {id: 3, name: 'Jessica'},
    {id: 4, name: 'Poornima'}
  ]
}

属性绑定

tsx
import {Component} from '@angular/core';

@Component({
  selector: 'app-root',
  styleUrls: ['app.component.css'],
  template: `
    <div [contentEditable]="isEditable"></div>
  `,    // 属性绑定使用 []
  standalone: true,
})
export class AppComponent {
  isEditable: boolean = true
}

事件处理

tsx
import {Component} from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <section (mouseover)="onMouseOver()">
      There's a secret message for you, hover to reveal 👀
      {{ message }}
    </section>
  `,    // 使用 () 来绑定事件
  standalone: true,
})
export class AppComponent {
  message = '';

  onMouseOver() {
    this.message = 'Way to go 🚀'
  }
}

组件间通信 父向子传值 @Input

ts
import {Component, Input} from '@angular/core';

@Component({
  selector: 'app-user',
  template: `
    <p>The user's name is {{ name }}</p>
  `,    // 2. 在模板中调用 name 属性
  standalone: true,
})
export class UserComponent {
    // 1. 定义一个 @Input 属性,相当于*其它*框架中的 props
  @Input() name:string = ''
}
ts
import {Component} from '@angular/core';
import {UserComponent} from './user.component';

@Component({
  selector: 'app-root',
  template: `
    <app-user name="Simran"/>
  `,    // 3. 在父组件中传入 name
  standalone: true,
  imports: [UserComponent],
})
export class AppComponent {}

组件间通信 子向父通知 @Output

ts

import {Component} from '@angular/core';
import {ChildComponent} from './child.component';

@Component({
  selector: 'app-root',
  // 3. 父组件接受 addItemEvent 事件
  template: `
    <app-child (addItemEvent)="addItem($event)" />
    <p>🐢 all the way down {{ items.length }}</p>
  `,
  standalone: true,
  imports: [ChildComponent],
})
export class AppComponent {
  items = new Array();

  // 4. 父组件执行方法
  addItem(item: string) {
    this.items.push(item);
  }
}
ts
import {Component, Output, EventEmitter} from '@angular/core';

@Component({
  selector: 'app-child',
  styles: `.btn { padding: 5px; }`,
  template: `
    <button class="btn" (click)="addItem()">Add Item</button>
  `,
  standalone: true,
})
export class ChildComponent {
  // 1. 注册一个事件
  @Output() addItemEvent = new EventEmitter<string>()
  // 2. 在触发 addItem 的时候,通过 .emit 触发 addItemEvent 事件
  addItem() {
    this.addItemEvent.emit('🐢')
  }
}

可延迟视图

ts
import {Component} from '@angular/core';
import {CommentsComponent} from './comments.component';

@Component({
  selector: 'app-root',
  template: `
    <div>
      <h1>How I feel about Angular</h1>
      <article>
        <p>...</p>
      </article>
      @defer(on viewport){      <!-- 视口触发,在进入视口后才触发 -->
        <comments />            <!-- 组件内容 -->
      } @placeholder {
        <p>Future comments</p>  <!-- 占位 -->
      } @loading (minimum 2s){  <!-- 最短等待时间 -->
        <p>Loading comments</p> <!-- 加载信息 -->
      }
    </div>
  `,
  standalone: true,
  imports: [CommentsComponent],
})
export class AppComponent {}

最后更新于: