自 2018 年以来,React 应用程序开发的最佳实践是使用 lambda 函数作为类属性而不是类方法。
作为类属性的 lambda 函数解决了上下文中可能发生的所有问题。如果使用它,您不必将方法绑定到特定的上下文。
例如,您this
在某些类方法中使用:
export default class SomeClass {
myProp = "kappa"
myMethod() {
console.log(this.myProp)
}
}
在这种情况下,如果您将使用它,例如,像某些事件侦听器一样,this
将会意外地(实际上,超出预期)从SomeClass
实例更改为其他值。所以,如果你使用类方法,你应该像这样修改你的代码:
export default class SomeClass {
constructor() {
this.myMethod = this.myMethod.bind(this)
}
myProp = "kappa"
myMethod() {
console.log(this.myProp)
}
}
在构造函数中,您将类方法绑定到SomeClass
实例上下文。
避免这种不必要的代码的最好方法(想象一下,你有 10 多个这种类型的方法 - 你应该绑定它们中的每一个),就是简单地使用 lambda 函数:
export default class SomeClass {
myProp = "kappa"
myMethod = () => {
console.log(this.myProp)
}
}
而已!Lambda 函数没有上下文,因此this
将始终指向SomeClass
实例。所以,现在您可以根据需要装饰您的类属性:
export default class SomeClass {
myProp = "kappa"
@action
myMethod = () => {
console.log(this.myProp)
}
}
请注意,如果您使用 Babel,则必须使用transform-class-properties
插件。
这个问题更多地与JavaScript的核心有关,所以我建议你阅读这篇MDN文章以获取更多关于this
行为的信息。
希望,这很有帮助!