很抱歉标题令人困惑;如果我的某个组件上有 onClick 属性,如下所示
<Component onClick={this.doSomething()} />
我经常会遇到奇怪的错误,具体取决于doSomething()函数实际调用的内容。如果doSomething()正在改变状态,特别是我会收到各种渲染错误。另一方面,如果我这样做
var _this = this;
<Component onClick{
function(){
_this.doSomething()
}
} />
所有错误都消失了,一切都按我的预期工作。通过将我的 onClick 属性包装在一个匿名函数中来使它工作,我到底在做什么?有没有更好的方法来做我想做的事情?
如果这样做:
<Component onClick={this.doSomething()} />
然后调用函数并将返回值分配给 onClick
属性。如果this.doSomething()
在渲染过程中修改组件状态,则会导致问题。
您应该能够使用:
<Component onClick={this.doSomething} />
即删除()
,因此函数被分配给属性,而不是执行函数的结果。
在组件类的构造函数中,应包含以下行:
this.doSomething = this.doSomething.bind(this);
您也可以使用onClick={this.doSomething.bind(this)}
,但这意味着每次重新渲染组件时都会创建一个新函数。
组件类中this
的绑定行为因组件的创建方式而异:
- 使用
class
关键字 (ES6),this
不会自动绑定 - 使用
React.createClass
,绑定this
使用 ES7,您还有更多选择:
- 使用
doSomething = () => { //...
而不是function
关键字 - 使用
onClick={::this.doSomething}
,一种绑定this
的速记方法
感谢泽克斯的有用评论。