我是ReactJS的新手,我遇到了错误" this.setState不是函数"。
constructor() {
super();
this.state = {
visible: false,
navLinesShow: true
};
this.navOpen = this.navOpen.bind(this)
}
navOpen() {
this.setState({
navStatus: "navShow",
navLinesShow: false
});
if ( this.state.visible === false) {
setTimeout(function (){
this.setState({
visible: true
});
}, 3000);
}
我已将this.navOpen = this.navOpen.bind(this)添加到构造函数中。所以我猜问题是setTimeout函数。
有什么可能的解决办法?
谢谢。
答案 0 :(得分:6)
是的问题是setTimeout函数中的setTimeout“this”是指函数本身:所以解决方案是典型的var that = this
:
navOpen() {
this.setState({
navStatus: "navShow",
navLinesShow: false
});
if ( this.state.visible === false) {
var that = this;
setTimeout(function (){
that.setState({
visible: true
});
}, 3000);
}
答案 1 :(得分:3)
这是因为this
由于运行时绑定而没有正确的值。你需要使用词法绑定。最好的解决方案是使用ES6
箭头函数() => {}
,它提供此值的词法绑定。即使使用setTimeout()
词法绑定,也可以解决你得到的错误
constructor() {
super();
this.state = {
visible: false,
navLinesShow: true
};
}
navOpen = () => {
this.setState({
navStatus: "navShow",
navLinesShow: false
});
if ( this.state.visible === false) {
setTimeout(() => {
this.setState({
visible: true
});
}, 3000);
}
}
答案 2 :(得分:2)
除了@ pinturic解决方案之外的另一个解决方案是使用ES6箭头功能。如果您正在使用ES6 / Babel等,则可以使用箭头功能绑定到词汇this
。
navOpen() {
this.setState({
navStatus: "navShow",
navLinesShow: false
});
if (!this.state.visible) {
setTimeout(() => this.setState({visible: true}), 3000);
}
}