在Angular中,将变量定义在类范围之外是一个好的实践吗?

3

在 Angular 中常见的代码如下:

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

@Component({
    selector: 'app',
    template: '<div *ngFor="let item of data"></div>'
})
export class App {
    // we define variable here
    data = [1, 2];
    tempData = [3, 4]; //temporary data, not involved in view rendering
}

我们可以看到,有一个临时变量不会涉及视图渲染,但是这个临时变量在我们的应用程序中也是必要的,用于暂时存储数据。

像这样写怎么样:

import { Component, OnInit } from '@angular/core';
const tempData = [3, 4]; //temporary data, not involved in view rendering
@Component({
    selector: 'app',
    template: '<div *ngFor="let item of data"></div>'
})

export class App {
    // we define variable here
    data = [1, 2];
}

由于临时变量不会在视图渲染中使用,因此我可以在类外定义它。并且我认为,这将优化性能(因为它减少了Angular的检测变量,我不知道这是否正确)。

那么哪种代码风格更好,并且它们之间是否有性能差异?

5个回答

11
在您的第一个示例中,每个类的实例都有一个tempData(它不是一个变量,而是一个属性)。在您的第二个示例中,所有类的实例都重复使用一个tempData(在这种情况下,它不是属性,而是常量)。
取决于您需要每个实例的tempData还是共享一个tempData
如果它是私有信息并且您不需要每个实例拥有,将其声明在模块的顶层(组件之外)是完全可以的。它将是该模块的私有内容。

那么哪种代码风格更好,它们之间是否有性能差异?

没有哪种风格更好;它们是不同的,做不同的事情,因此根据您需要做什么来选择其中之一。它们之间的任何性能差异都将非常微不足道,无需考虑。

你说“它将是该模块的私有属性。”难道你的意思不是“该组件的私有属性”吗?(OP的代码是为一个组件编写的。)它是否可以在定义该组件的文件之外被访问? - John Pankowicz
@JohnPankowicz - 我的意思是“模块”。如果该模块仅定义了一个组件而没有其他内容,那么它就是一样的,但是一个模块可以定义多个组件,或者一个组件和其他导出函数等。 - T.J. Crowder

2

这真的取决于您。

但是,不,它不会减少Angular变量检测并提高性能:如果您在视图渲染中不使用它,Angular就不会关心它(当然,这是我所理解的)。

我的方式是这样的:

  • 如果变量与功能相关,则将其声明为static
  • 如果变量与功能无关,但是是功能的元数据(例如注入令牌),则将其声明为导出常量

2

说实话,我从来没有想过。

就像你自己所说的,第一个示例将在初始化组件类中包含变量及其数据,但只要它只是坐在那里,就不应该有更多或更少重要的性能变化。除非它是一些巨大的表格数据持有者,在这种情况下,您可能会异步执行它。

但是在类外部使用变量以获得更干净的代码是很常见的。例如,我通常在路由器模块之外声明我的路由对象,然后导出对象,如export const routes:Routes = [],然后在需要的地方重新导入它,以使代码更加清晰。


1

示例1:

每当在类中创建一个变量时,该变量就成为该类实例的属性。也就是说,它是创建到该类的对象的成员。

示例2:

如果您不希望将变量用于该类的每个实例,可以将其声明为静态或常量变量。

注意: Angular应用程序的性能并不太依赖于使用的变量。 相反,您可以通过减少循环执行和函数调用来优化性能,前提是您不会创建无限多的变量。

最后,您无法比较和判断两个示例或声明变量的方式哪个更好。


-1
我认为这是一个非常重要的问题,特别是在今天和angular组件相关的情况下。
对于你的代码库设置最佳实践可能是个不错的选择。
你关于视图渲染和变化检测的推理听起来也是合理的。虽然可能影响不大,但有助于提高代码的可读性。
此外,可以遵循的一种做法是为每个组件单独创建一个包含变量的文件。这对于具有许多常量、标志和临时变量的组件可能很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接