在 HTML 上使用 setter 和 getter 变量(角度组件)

2024-03-11

我创建了一个简单的角度组件来测试使用 getter/setter 样式的变量的使用情况:

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

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  _name = 'Variable Example';
  get name(): string {
    console.log("GET!!!");
    return this._name;
  }

  set name(value:string): void {
    this._name = value;
  }
}

然后,我在 html 上使用这个变量:

<p>
  {{ name }}
</p>

我注意到的是get name()被呼叫 4 次(查看现场here https://stackblitz.com/edit/angular-8conqj?file=src%2Fapp%2Fapp.component.html)

有任何最佳实践规则指出getter and setters不应该用在 html 组件上吗?使用这种方法会遇到性能问题吗?

谢谢你!

PS:这不是真实的场景,这只是我正在做的一个小例子。


以下是我的经验法则,对我非常有用:

  1. 总是使用OnPush改变检测策略以避免不必要的检查

  2. 始终使用不可变数据,在任何更改时更新整个数组/对象。如果您不熟悉 Google 不变性,它非常有帮助,并且是必备的OnPush.

  3. 永远不要存储可以计算的状态。如果可以使用组件 @Inputs 来计算 - 那就去getter。通过数学计算简单的 getter 或遍历一个小数组非常快,并且可以省去同步状态的麻烦。我在 Firefox 中进行了基准测试,一个超过 100 个元素的数组的简单 getter 每秒执行 700 万次。一般来说,getter 不会成为应用程序的瓶颈,并且它们更容易使用,而不是更新生命周期挂钩中的状态。但请进一步阅读。

  4. 如果你的计算状态产生一个新的array or object- 始终使用纯管以避免不必要的重新计算,因为这是一个繁重的操作并且不适合 getter。

  5. 如果你的 getter 不会改变 - 考虑一下惰性初始化图案:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get#Smart_self-overwriting_lazy_getters https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get#Smart_self-overwriting_lazy_getters

  6. 避免 ngOnChange支持 @Inputs 上的设置器 - 这样您的更改可以更“直接”地传播。有些东西发生了变化 - 相关的东西被更新,而不是“副作用”它到稍后调用的某个钩子。

NOTICE:这些只是我在使用 Angular 处理复杂项目的几年中所开发的问题的想法。

您可以在我写的这篇文章中阅读有关编写 Angular 代码的声明式方法的更多信息:https://indepth.dev/compliant-components-declarative-approach-in-angular/ https://indepth.dev/compliant-components-declarative-approach-in-angular/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 HTML 上使用 setter 和 getter 变量(角度组件) 的相关文章

随机推荐

  • 闪亮的自定义输出未渲染

    我正在尝试将 D3 js 的网络可视化绑定到 Shiny 中的自定义输出 由于某种原因 我的渲染函数似乎没有被调用 这是我的代码 绑定 js var forceNetworkOB new Shiny OutputBinding forceN
  • 如何在内部java api或jest api中获取弹性搜索索引的类型名称

    我有一个名为 demo 的索引 它包含不同的类型 我在我的应用程序中使用弹性搜索 java 内部 api 和rest api 玩笑 基本上我想提出这个要求 curl XGET http localhost 9200 demo mapping
  • 如何使用 multer 存储带有文件扩展名的文件?

    设法将我的文件存储在一个文件夹中 但它们存储时没有文件扩展名 有谁知道如何存储带有文件扩展名的文件 我有一个解决方法来添加正确的文件扩展名 如果你使用path节点模块 var multer require multer var path r
  • 连接在远程 IP 上被拒绝,但在本地 IP 上被接受

    正如标题所说 我的服务器在本地计算机上运行 我对其进行了测试和调试 它运行得很好 服务器也是用java编写的 但是当我尝试用我的远程IP 而不是192 168 0 113 我使用146 255 x x 测试它时 服务器没有收到任何东西 而客
  • Kendo UI MVVM 与 TypeScript - 将 ViewModel 制作为“类”

    我正在将一个项目转换为 Typescript 它使用 Kendo UI 的 MVVM 架构 然而 我对类的概念及其与视图模型的关系有一些疑问 我将建立一个班级并扩展kendo data ObservableObject 您可以从中创建视图模
  • wget 无法下载 - 404 错误

    我尝试使用 wget 下载图像 但收到如下错误 2011 10 01 16 45 42 http www icerts com images logo jpg Resolving www icerts com 97 74 86 3 Conn
  • Android 应用程序的蓝牙连接自动断开

    我正在创建一个应用程序 它以编程方式与 Android 应用程序连接 BLE 设备 这是我的连接 断开连接代码 当用户单击 连接 按钮时 new Thread new Runnable Override public void run mC
  • 使用 SMTP 发送电子邮件 codeigniter

    我正在尝试使用 smtp codeigniter 发送电子邮件 我正在使用的代码如下 public function notify marketing config Array protocol gt smtp smtp host gt s
  • C# 中是否有 ShouldSerialize[PropertyName] 的替代方案?

    我最近一直在编写大量代码 其中涉及使用 Json NET 进行序列化 并且由于我序列化的数据的性质 有时并非所有属性都需要序列化 因此 我执行如下操作 public int Foo get set public bool ShouldSer
  • 好的 asp.net (C#) 应用程序? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 对于满足以下条件的优秀开源 asp net C 应用程序有什么建议吗 设计精良且多层次 干净且带注释的
  • Ruby:读取 PDF 文件

    我正在寻找一种快速可靠的方法来在 Ruby 在 Linux 和 OSX 上 中读取 解析大型 PDF 文件 直到现在我发现了相当古老和简单的PDF 工具包 http pdf toolkit rubyforge org a pdf转文本 ht
  • ASP.NET 5 Web 应用程序作为 Azure Web 角色?

    我们的解决方案中有一个 ASP NET 5 Web 应用程序 通常 我们可以右键单击云服务 角色 项 然后从解决方案中的现有项目添加新角色 但它无法将该项目标识为 Web 角色 我们如何能够在 Azure Web 角色中托管 ASP NET
  • 生成位置周围的随机坐标

    我想要一个函数 它接受地理位置 纬度 经度 并生成周围的随机坐标集 但也将这些参数作为计算的一部分 要制作的随机坐标数 生成半径 随机坐标之间的最小距离 以米为单位 用于生成其周围位置的根坐标 生成方式的示例 实现这一目标的好方法是什么 生
  • 使用环境变量的 Maven 本地存储库

    如何使用环境用户变量设置 标记 我尝试了这条路 myRepo repo 但它不起作用 myRepo C maven repo 我无法使用绝对路径来解决可移植性问题 但我可以将 myRepo 设置到每个系统上的正确位置 其中绝对路径可能会有所
  • 我可以在本地测试 AWS Glue 代码吗?

    阅读 Amazon 文档后 我的理解是运行 测试 Glue 脚本的唯一方法是将其部署到开发端点并在必要时进行远程调试 同时 如果 Python 代码由多个文件和包组成 则除了主脚本之外的所有文件和包都需要压缩 这一切让我感觉 Glue 不适
  • 如何使用与其文件扩展名关联的程序打开文件?

    有没有一种简单的方法可以在Windows中通过其关联程序打开文件 就像在 Windows 资源管理器中双击它一样 但使用我的代码自动完成 例如 在计算机 A 上 text txt 将在写字板中打开 但在计算机 B 上 由于用户文件扩展名分配
  • Bootstrap - 选择和按钮彼此相邻

    我有一个
  • 我应该如何编写 .i 文件来包装 Java 或 C# 中的回调

    我的 C 程序使用定期调用的回调函数 我希望能够处理 Java 或 C 程序中的回调函数 我应该如何编写 i 文件来实现此目的 C 回调看起来像这样 static void on incoming call pjsua acc id acc
  • JDBI 的 @BindBean 在 INSERT 期间未在 bean 类中找到命名参数

    当使用 JDBI 的 BindBean 将值插入 Dropwizard 中的 Mysql 数据库时 我始终遇到以下异常 问题似乎是 JDBI 无法找到 bean 中的属性 我已经将该问题隔离到一个单独的项目中 但无法弄清楚哪里出了问题 我将
  • 在 HTML 上使用 setter 和 getter 变量(角度组件)

    我创建了一个简单的角度组件来测试使用 getter setter 样式的变量的使用情况 import Component from angular core Component selector my app templateUrl app