【问题标题】:How can I have class-wide constant in my React Component class?如何在我的 React 组件类中拥有类范围的常量?
【发布时间】:2017-11-03 17:08:07
【问题描述】:

通常我会这样做:

var tagSymbols = Object.freeze([
  '!',
  '+',
  '@'
]);

但后来我知道有来自 Babel (?) 的 const

const tagSymbols = Object.freeze([
  '!',
  '+',
  '@'
]);

两者都返回相同的错误:

Syntax error: Unexpected token (4:6)

  2 | 
  3 | class GeneralToDoListInput extends Component {
> 4 |   var tagSymbols = Object.freeze([
    |       ^
  5 |     '!',
  6 |     '+',
  7 |     '@'

Syntax error: Unexpected token (5:8)

  3 | class GeneralToDoListInput extends Component {
  4 | 
> 5 |   const tagSymbols = Object.freeze([
    |         ^
  6 |     '!',
  7 |     '+',
  8 |     '@'

【问题讨论】:

  • 您希望它成为您的用户的公共属性,还是仅在此类代码中可用?
  • 仅限本课程!

标签: javascript reactjs babeljs


【解决方案1】:

您不能将变量声明放在类体内。这只是语言所不允许的。在 ES6 中,类声明的结构基本上是

class Foo() {
  method1() {}
  method2() {}
  ...
}

最简单的解决方案是将变量声明放在类之外:

const tagSymbols = ...:
class GeneralToDoListInput extends Component {
  ...
}

类/模块中的任何代码都可以访问tagSymbols

如果它真的必须是一个类属性,你可以定义一个静态 getter:

class GeneralToDoListInput extends Component {
  static get tagSymbols() {
    return Object.freeze(...);
  }
}

或者在声明之后赋值给类:

class GeneralToDoListInput extends Component {
  ...
}
GeneralToDoListInput.tagSymbols = ...;

【讨论】:

  • 我喜欢这个直截了当的答案。我将使用静态吸气剂。这似乎是最结构化的方式,但我担心它会使代码更长。
  • 请注意,使用 getter 时,每次访问属性时都会创建一个新对象。如果不必在课堂外访问tagSymbols,我会采用第一种方法。
  • 不是变成全局变量了吗?如果放在课外呢?此外,第二种方法相当冗长this.constructor.tagSymbols
  • 由于您使用的是 react,我假设每个文件实际上都是一个模块。所以不,它将被限制在模块范围内。
  • 酷,所以它实际上变得更像Python。谢谢老哥!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
相关资源
最近更新 更多