我期待在"没有绑定"时记录undefined
。单击了按钮,因为当您将方法引用明确地作为回调传递时,不应该使用正确的this
上下文调用它,但是使用箭头函数时,应该。
但是,我看到回调函数可以访问this
并且this.state.number
的值已正确记录。方法参考和箭头功能执行完全相同。为什么呢?
这与箭头函数类属性没有关系,它与将方法的引用作为回调传递给setState
而不是箭头函数有关。 < / p>
class Hello extends React.Component {
constructor(props) {
super(props);
this.state = {
number: 1,
};
}
onClickWithThisBindingInCallback = () => {
this.setState({ number: 2 }, () => { this.myCallback(); });
};
onClickWithoutThisBindingInCallback = () => {
const myCb = this.myCallback;
this.setState({ number: 3 }, myCb);
};
myCallback() {
console.log(this.state.number);
}
render() {
return (
<div className="App">
<button onClick={this.onClickWithThisBindingInCallback}>With binding</button>
<button onClick={this.onClickWithoutThisBindingInCallback}>Without binding</button>
</div>
);
}
}
ReactDOM.render(
<Hello name="World" />,
document.getElementById('container')
);
&#13;
<script src="https://unpkg.com/react@16.2.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.2.0/umd/react-dom.development.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your component. -->
</div>
&#13;
答案 0 :(得分:1)
React使用组件的setState
调用this
的回调函数,如this line of code所示。
致谢:@Li357
答案 1 :(得分:-2)
这是因为你给它一个lambda函数:
onClickWithThisBinding = () => {
lambda函数在给定的上下文中执行。所以绑定实际上是onClick={() => { .. }}
。这就是它具有this
上下文的原因。
答案 2 :(得分:-2)
这是由于使用了箭头功能。
箭头函数始终与其周围代码具有相同的this
。
查看更多here。
如果您希望该方法不被绑定到该特定类,您可以使用这样的普通函数。
onClickWithoutThisBinding() {
const myCb = this.myCallback;
this.setState({ number: 3 }, myCb);
};