例如,给定具有函数increaseQty的类
increaseQty() {
this.qty++
}
和电话
render() {
return (
<div>
<button onClick={this.increaseQty}>Increase</button>
</div>
)
}
除非我在构造函数中将this
的上下文绑定到函数,否则this.qty将是未定义的。
constructor(props) {
super(props)
this.qty = 0
this.increaseQty = this.increaseQty.bind(this) // <---- like so
}
然而,如果您只是正常使用它,那么在正常的es6类中就不是这种情况了:
https://jsfiddle.net/omrf0t20/2/
class Test {
constructor() {
this.qty = 0
}
increaseQty() {
console.log(++this.qty)
}
doStuff() {
this.increaseQty()
}
}
const t = new Test()
t.doStuff() // prints 1
React的哪个方面使得render
在没有this
的上下文的情况下被调用?
答案 0 :(得分:1)
这里的区别在于,在使用React的示例中,您将increaseQty
作为回调传递给另一个组件,但在第二个中,您在当前上下文中调用它。
您可以在简化示例中看到差异
class Test {
constructor() {
this.qty = 0
}
increaseQty() {
console.log(++this.qty)
}
doStuff() {
this.increaseQty(); // no need to bind
}
listenClicks() {
// you should use bind to preserve context
document.body.addEventListener('click', this.increaseQty.bind(this));
}
}
React指南还建议您在构造函数中绑定方法,使代码更加优化,绑定一次并始终使用相同的函数,而不是为每个render()
调用创建新的绑定版本。