Angular的新未来:尝试使用Signals来实践它

嗨!奥斯汀你好吗?嗯,你干嘛呢?

概述

我将介绍一些使用 Angular 16 中预计包含的新原始信号的具体示例!

信号是什么?

这是Angular框架为了高效检测变更而引入的新的响应性原语。

SolidJS的signal与概念是相同的,非常简单。 Signal具有以下两个特点。

SolidJS的信号与概念相同,并且非常简单。Signal具有以下两个特征。

    1. 具有保持数值的能力

 

    具有在数值发生变化时发出信号的能力

将上述的两个特点应用于Angular,就可以轻松地将同步处理反映到模板中。

请阅读以下文章以了解有关Signal和Angular变更的详细信息。

 

以试验性使用Signal API的方法

如果有人仍然想要使用Signal!实际上,Angular团队已经将其作为POC实施并发布了!

要使用@angular/cli@16.0.0,必须使用它。

由于版本经常试验性地更改,所以请通过npm来确认当前最新版本。

 

从上面的npm页面获取最新版本后,将其输入以下命令并执行,即可创建一个Angular 16项目。

npx -p @angular/cli@16.0.0-next.6 ng new signals-play
Screenshot 2023-04-03 at 8.59.23.png

使用信号作为组件和模板

让我们在app.component.ts中尝试导入信号。

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

在这里有补充说明,但标注为@developerPreview。

Screenshot 2023-04-03 at 9.01.28.png

如果我们将初始值分配到以下的变量中,它会帮我们推断出变量的类型。

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

@Component({
...
})
export class AppComponent {
  clickCount = signal(0);

  addClick() {
    this.clickCount.update((clicks) => clicks + 1);
    // OR
    this.clickCount.set(this.clickCount() + 1);
  }
}

在模板中可以按以下方式显示当前值。模板会将clickCount作为一个函数调用,并获取当前的值。

<h1>Count: </h1>
<p>{{ this.clickCount() }}</p>

<button (click)="this.addClick()" type="button">Add 2</button>

也许有一些有经验的人知道在模板中调用函数是很危险的,但Signal不会引起副作用,所以不必担心。

将会得到如下结果。

ezgif.com-video-to-gif.gif

非常简单。

使用computed的方法

(Simplified Chinese: 使用computed的方法)

Signal只有两个作用,就是根据上述说明,它具有一个值并且在该值变化时通知这种变化。

然而,大多数同步处理都是基于值和值之间的计算。

在使用信号进行计算时,可以使用computed函数!

我将在下面的例子中介绍页面按钮。


import { Component, signal, computed } from '@angular/core';

@Component({
...
})
export class AppComponent {
  private itemCount = signal(124);
  private itemsPerPage = signal(10);
  currentPage = signal(0);
  pageCount = computed(() => Math.ceil(this.itemCount() / this.itemsPerPage()));
  canGoForward = computed(() => this.currentPage() < this.pageCount());
  canGoBack = computed(() => this.currentPage() !== 0);

  goForward() {
    if (!this.canGoForward()) return;
    this.currentPage.update((pageNo) => pageNo + 1);
  }

  goBack() {
    if (!this.canGoBack()) return;
    this.currentPage.update((pageNo) => pageNo - 1);
  }
}

在模板中,我们将上述逻辑应用到按钮属性上,具体如下所示。

<h1>Current Page</h1>
<p>{{ this.currentPage() }}</p>
<nav>
  <button (click)="this.goBack()" type="button" [disabled]="!this.canGoBack()">Back</button>
  <button (click)="this.goForward()" type="button" [disabled]="!this.canGoForward()">Next</button>
</nav>

结果 (jié guǒ)

ezgif.com-video-to-gif (1).gif

非常简单而令人赞叹! ér !)

总结

Angular的信号逐渐具体化,令人兴奋不已。

既然像上面提到的同步处理在每个逻辑中都变得非常简单,那真是帮了我大忙。

同时,由于Vue具有类似的语法结构,所以作者觉得很容易接受。

大家也请务必试一试!

广告
将在 10 秒后关闭
bannerAds