反应。 this.setState不是setTimeout中的函数

时间:2017-03-07 13:51:38

标签: javascript reactjs

当前组件的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

}

1 个答案:

答案 0 :(得分:59)

你正在失去背景。使用箭头函数作为保存正确执行上下文的简单方法:

setTimeout(() => {
  this.setState({breaker: false});
}, 2000)

请记住,匿名函数将在其中包含上下文window,除非您将其与Function.prototype.bind明确绑定。所以这是解决这个问题的另一种方法:

setTimeout(function () {
  this.setState({breaker: false});
}.bind(this), 2000)