跳转到主要内容

标签(标签)

资源精选(342) Go开发(108) Go语言(103) Go(99) angular(82) LLM(75) 大语言模型(63) 人工智能(53) 前端开发(50) LangChain(43) golang(43) 机器学习(39) Go工程师(38) Go程序员(38) Go开发者(36) React(33) Go基础(29) Python(24) Vue(22) Web开发(20) Web技术(19) 精选资源(19) 深度学习(19) Java(18) ChatGTP(17) Cookie(16) android(16) 前端框架(13) JavaScript(13) Next.js(12) 安卓(11) 聊天机器人(10) typescript(10) 资料精选(10) NLP(10) 第三方Cookie(9) Redwoodjs(9) LLMOps(9) Go语言中级开发(9) 自然语言处理(9) PostgreSQL(9) 区块链(9) mlops(9) 安全(9) 全栈开发(8) ChatGPT(8) OpenAI(8) Linux(8) AI(8) GraphQL(8) iOS(8) 软件架构(7) Go语言高级开发(7) AWS(7) C++(7) 数据科学(7) whisper(6) Prisma(6) 隐私保护(6) RAG(6) JSON(6) DevOps(6) 数据可视化(6) wasm(6) 计算机视觉(6) 算法(6) Rust(6) 微服务(6) 隐私沙盒(5) FedCM(5) 语音识别(5) Angular开发(5) 快速应用开发(5) 提示工程(5) Agent(5) LLaMA(5) 低代码开发(5) Go测试(5) gorm(5) REST API(5) 推荐系统(5) WebAssembly(5) GameDev(5) CMS(5) CSS(5) machine-learning(5) 机器人(5) 游戏开发(5) Blockchain(5) Web安全(5) Kotlin(5) 低代码平台(5) 机器学习资源(5) Go资源(5) Nodejs(5) PHP(5) Swift(5) 智能体(4) devin(4) Blitz(4) javascript框架(4) Redwood(4) GDPR(4) 生成式人工智能(4) Angular16(4) Alpaca(4) 编程语言(4) SAML(4) JWT(4) JSON处理(4) Go并发(4) kafka(4) 移动开发(4) 移动应用(4) security(4) 隐私(4) spring-boot(4) 物联网(4) nextjs(4) 网络安全(4) API(4) Ruby(4) 信息安全(4) flutter(4) 专家智能体(3) Chrome(3) CHIPS(3) 3PC(3) SSE(3) 人工智能软件工程师(3) LLM Agent(3) Remix(3) Ubuntu(3) GPT4All(3) 软件开发(3) 问答系统(3) 开发工具(3) 最佳实践(3) RxJS(3) SSR(3) Node.js(3) Dolly(3) 移动应用开发(3) 低代码(3) IAM(3) Web框架(3) CORS(3) 基准测试(3) Go语言数据库开发(3) Oauth2(3) 并发(3) 主题(3) Theme(3) earth(3) nginx(3) 软件工程(3) azure(3) keycloak(3) 生产力工具(3) gpt3(3) 工作流(3) C(3) jupyter(3) 认证(3) prometheus(3) GAN(3) Spring(3) 逆向工程(3) 应用安全(3) Docker(3) Django(3) R(3) .NET(3) 大数据(3) Hacking(3) 渗透测试(3) C++资源(3) Mac(3) 微信小程序(3) Python资源(3) JHipster(3) 大型语言模型(2) 语言模型(2) 可穿戴设备(2) JDK(2) SQL(2) Apache(2) Hashicorp Vault(2) Spring Cloud Vault(2) Go语言Web开发(2) Go测试工程师(2) WebSocket(2) 容器化(2) AES(2) 加密(2) 输入验证(2) ORM(2) Fiber(2) Postgres(2) Gorilla Mux(2) Go数据库开发(2) 模块(2) 泛型(2) 指针(2) HTTP(2) PostgreSQL开发(2) Vault(2) K8s(2) Spring boot(2) R语言(2) 深度学习资源(2) 半监督学习(2) semi-supervised-learning(2) architecture(2) 普罗米修斯(2) 嵌入模型(2) productivity(2) 编码(2) Qt(2) 前端(2) Rust语言(2) NeRF(2) 神经辐射场(2) 元宇宙(2) CPP(2) 数据分析(2) spark(2) 流处理(2) Ionic(2) 人体姿势估计(2) human-pose-estimation(2) 视频处理(2) deep-learning(2) kotlin语言(2) kotlin开发(2) burp(2) Chatbot(2) npm(2) quantum(2) OCR(2) 游戏(2) game(2) 内容管理系统(2) MySQL(2) python-books(2) pentest(2) opengl(2) IDE(2) 漏洞赏金(2) Web(2) 知识图谱(2) PyTorch(2) 数据库(2) reverse-engineering(2) 数据工程(2) swift开发(2) rest(2) robotics(2) ios-animation(2) 知识蒸馏(2) 安卓开发(2) nestjs(2) solidity(2) 爬虫(2) 面试(2) 容器(2) C++精选(2) 人工智能资源(2) Machine Learning(2) 备忘单(2) 编程书籍(2) angular资源(2) 速查表(2) cheatsheets(2) SecOps(2) mlops资源(2) R资源(2) DDD(2) 架构设计模式(2) 量化(2) Hacking资源(2) 强化学习(2) flask(2) 设计(2) 性能(2) Sysadmin(2) 系统管理员(2) Java资源(2) 机器学习精选(2) android资源(2) android-UI(2) Mac资源(2) iOS资源(2) Vue资源(2) flutter资源(2) JavaScript精选(2) JavaScript资源(2) Rust开发(2) deeplearning(2) RAD(2)

Angular不断发展,创建组件的方法也在不断发展。加入我的组件开发指南之旅

去Angular 17是一段漫长的旅程。在保持向后兼容性的同时,Angular团队正在不断发展框架。和许多其他人一样,我发现自己一直在思考使用什么以及何时使用它。在本文中,我将表达我对创建新组件时应该使用什么的想法。

Signals

信号从版本16开始就可用了,它们是应用程序上管理状态的必备工具。如果你还没有使用Signals,是时候开始使用了。最初,可能会有一个学习曲线,但它很简单,随着时间的推移,它会变得很自然。与OnPush变化检测相结合,它提供了精细调整的反应性、性能增益和令人愉快的开发体验。

Observables

如果我们有信号,为什么我们需要可观察性?请记住,信号处理同步反应性,而可观察性处理异步反应性,例如HTTP请求,同时为我们提供与这些值交互的工具(map、switchMap)。

ChangeDetection.OnPush

首先,对每一个进行简要说明:

默认值:Angular触发对浏览器事件、计时器、XHR和承诺的更改检测。然后,系统从上到下依次检查组件树中的每个组件。在大型系统中,这可能会导致性能问题。

OnPush:它禁用默认的更改检测。简而言之,该组件仅在少数特定情况下重新渲染:

  • 异步管道新值
  • 输入引用已更改(引用,而不是值,不变性)。
  • 源自组件或其中一个子级的事件。
  • 手动触发器

那么,仅仅通过阅读以上内容,你就已经知道了吗?正确的

始终使用ChangeDetection。OnPush,当与Signals结合时,您可以将组件性能提升到另一个级别。此外,当Angular完成完全无区域的实现时,您的应用程序离实现它又近了一步。

控制流程

@if (a > b) {
  {{a}} is greater than {{b}}
}

自V17以来,我们为Angular提供了新的控制流程。是的,它在开发者预览版中,但它感觉非常自然和强大,因为它和js语法完全一样。因此,你应该使用它。然而,我发现自己仍然经常使用旧的*ngIf指令。有时你只想隐藏一个<span>,我认为这仍然比写三行更容易。可用的块是@If、@for、@switch。

Inject() VS constructor()

这个决定可能具有挑战性。我目前使用inject(),了解这两种方法的优缺点,尽管详细的探索超出了本文的讨论范围。

在我的特定情况下,对inject()的偏好很大程度上是由于语法糖。它与其他框架中的约定更加无缝地一致。尽管遇到了一些开发人员(最初包括我自己)的抵制,但在代码可读性方面,这种转变还是有回报的。然而,需要注意的是,我们并没有完全从使用constructor()中解放出来。我非常依赖它,尤其是Signal effect(),因为它们需要在注入上下文中运行。我发现这是在这种情况下最直接的方法。

供参考的组件:

import {
  ChangeDetectionStrategy,
  Component,
  inject,
  signal,
} from '@angular/core';
import { MsalService } from '@azure/msal-angular';
import { UsersService } from 'src/app/api/users-services';
import { Observable } from 'rxjs';
import { AsyncPipe, DatePipe } from '@angular/common';

export interface UserDetail {
  id: string;
  key: string;
  timestamp: string;
}

@Component({
  selector: 'app-users-widget',
  template: `<div>
    @if ((detailsList$ | async); as userData){
    <div>
      @for(data of userData; track data.id){
      <div (click)="setDetails(data)">
        {{ data.id }}
      </div>
      }
    </div>
    } @if (openDetail(); as openDetail){
    <h2>User Details</h2>
    <p>{{ openDetail.id }}</p>
    <p>{{ openDetail.key }}</p>
    <p>{{ openDetail.timestamp | date : 'long' }}</p>
    }
  </div> `,
  standalone: true,
  imports: [DatePipe, AsyncPipe],
  changeDetection: ChangeDetectionStrategy.OnPush,
})

export class UsersWidgetComponent {
  usersService = inject(UsersService);
  //# for private modifier
  #authService = inject(MsalService);

  openDetail = signal<UserDetail | null>(null);
  detailsList$: Observable<Array<UserDetail>> = new Observable();
  
  //Using the constructor instead of the ng lifecycle
  constructor() {
    this.retrieveFlowHistoryData();
  }
  
  retrieveFlowHistoryData() {
    const { username } = this.#authService.instance.getAllAccounts()[0];
    this.detailsList$ = this.usersService.apiFlowsHistoryGet$Json({
      UserName: username,
    });
  }

  setDetails(detail: UserDetail) {
    this.openDetail.set(detail);
  }
}

包装

浏览不断发展的库和框架可能是一项具有挑战性的任务。我相信这篇文章已经为您提供了一些最新的Angular约定的见解。直到下一次!

TL;DR

✅ 独立

✅ 注射

✅ 控制流程

✅ 可观察的

✅ 变更检测。OnPush

✅ Typescript private#修饰符

✅✅ 信号

✅ ‘as’用于变量中的存储条件

 

文章链接