【发布时间】:2017-11-30 09:02:47
【问题描述】:
截至 2017 年 11 月,我知道几种将方法绑定到 React 组件的方法,以便 this 关键字指向拥有该方法的 React 元素(例如,在事件处理程序中是必需的)
1.在构造函数中绑定
class A extends React.Component {
constructor(props) {
super(props)
this._eventHandler = this._eventHandler.bind(this)
}
_eventHandler() {
// ...
}
render() {
return <div onClick={this._eventHandler} />
}
}
2。 render() 中的箭头函数
class A extends React.Component {
_eventHandler() {
// ...
}
render() {
return <div onClick={()=>{this._eventHandler()}} />
}
}
3.在 render() 中绑定
class A extends React.Component {
_eventHandler() {
// ...
}
render() {
return <div onClick={this._eventHandler.bind(this)} />
}
}
4. ES2015 类字段中的箭头函数
class A extends React.Component {
_eventHandler = () => {
// ...
}
render() {
return <div onClick={this._eventHandler} />
}
}
5. @autobind 装饰器
class A extends React.Component {
@autobind
_eventHandler() {
// ...
}
render() {
return <div onClick={this._eventHandler} />
}
}
1 是最安全的方式,因为它不需要 babel 的构建时转换,但打字很烦人。
2 和 3 由于每次渲染和 React diff 算法的绑定都会对性能产生影响
4 和 5 需要比 1 少得多的输入,但它们需要 babel 的支持,并且可能不是最终规范的一部分然而。除此之外,我非常反对注解的想法(来自 Java 后端背景,我鄙视注解,因为它们经常被过度使用且过于神奇)
在最新的 Babel 版本中,4 或 5 是推荐和最安全(关于未来兼容性)的绑定函数方式吗?还有其他我不知道的方法吗?我应该继续使用 1 吗?此外,如果这些被认为可以安全使用,是否有任何代码模块可以更改我的代码库以使用它们?
编辑:@LucaFabbri 指向reflective bind babel 变换。它看起来很酷,但它需要一个我不喜欢的非标准 babel-plugin,因为它对未来不是很安全。我尽量避免构建时魔法,如果您长时间只在一个代码库上工作,则可以使用它们,但如果您维护多个代码库,则每次都需要处理构建时魔法(加上不支持 create-react-app 而不弹出)。
【问题讨论】:
-
我认为您已经强调了每种方法的所有优点和缺点。看过很多代码库后,没有一种方法可以解决这个问题,所以我预计至少 1、2 和 3 会持续很长时间。在我看来,如果您关心的是面向未来,请坚持使用 1 或 3。
-
我尝试了各种方法。对我来说,不费吹灰之力的选择是 #4,因为我更喜欢干净的代码。
-
同意安杰洛斯。此外,我认为没有任何理由强调方法,因为没有真正的公共/私人差异
-
我认为#4 最终会被优化并变得更加流行。虽然没有确凿的数据,只是观察空间的轶事证据
-
阅读flexport.engineering/… 以使用新方法扩展您的分析
标签: javascript reactjs