我见过使用Javascript类的代码使用以下形式(例如React):
class UserProfile extends Component {
state = {
open: false
}
handleOpen = () => {
this.setState({ open: true })
}
}
为什么将handleOpen
实现为设置为函数的属性而不是像:
class UserProfile extends Component {
state = {
open: false
}
handleOpen() {
this.setState({ open: true })
}
}
提前致谢!
答案 0 :(得分:4)
这也是一个功能,但它被称为箭头功能,其工作方式与传统的"略有不同。实现。它是与ECMAScript 6一起引入的。
这是MDN docs所说的内容:
箭头函数表达式的语法短于function expression,并且不绑定自己的this,arguments,super或new.target。这些函数表达式最适合非方法函数,不能用作构造函数。
主要好处之一是您不需要将this
绑定到该函数,因为箭头函数没有自己的this
对象:
在箭头功能之前,每个新函数都定义了自己的这个值
这保证了范围安全;偶然使用错误的this
是不可能的。它可以说也更具可读性。
然而,一个缺点是箭头函数是匿名的,这意味着当你的代码中出现错误时,很难进行堆栈跟踪。但对于React应用程序,我们可以使用devtool:' cheap-module -eval - 源地图'从babel到我们的堆栈跟踪中很容易找到错误。
答案 1 :(得分:1)
这是关于你方法中this
的上下文。如果你像第二个例子那样实现它,this
将不会引用组件实例,使用箭头函数,就像在第一个示例this
中引用组件实例一样。 (由于未使用React.createClass
)。
对于第二个示例,您必须在构造函数中执行this.handleOpen = this.handleOpen.bind(this)
。
编辑:有关arrow functions
的详细信息,请参阅Chris
的答案。