当前组件的state.breaker
值为false。捕获滚动事件时,它会查看state
,如果它false
它会执行某些操作。
我希望在操作重复之前有某种静态延迟,这就是为什么在goTo
函数内state.breaker
设置为true
并阻止进一步的逻辑2s
之前的setTimeout
的当前方法将返回false
。
但是在当前时刻发生以下错误 未捕获的TypeError:在setState
内调用setTimeout
时,this.setState不是函数
class Slide extends Component {
constructor(props) {
super(props)
this.state = {
breaker: false
}
this.scrollRedirect = this.scrollRedirect.bind(this);
}
componentDidMount() {
this.refs.holder.addEventListener('mousewheel', this.scrollRedirect);
}
scrollRedirect(e) {
const path = this.props.location.pathname,
goTo = (route) => {
this.setState({breaker: true});
hashHistory.push(route);
setTimeout(function () {
this.setState({breaker: false});
}, 2000)
};
if (!this.state.breaker) {
... code that executes goTo on condition
}
}
... render code
}
答案 0 :(得分:59)
你正在失去背景。使用箭头函数作为保存正确执行上下文的简单方法:
setTimeout(() => {
this.setState({breaker: false});
}, 2000)
请记住,匿名函数将在其中包含上下文window
,除非您将其与Function.prototype.bind明确绑定。所以这是解决这个问题的另一种方法:
setTimeout(function () {
this.setState({breaker: false});
}.bind(this), 2000)