更新循环中的状态不起作用

时间:2018-08-25 17:00:06

标签: reactjs

我正在研究React应用程序。我有一个按钮,该按钮调用一个函数,可在其中更改应用程序的状态。单击按钮后,我要继续更改状态,直到再次单击按钮(停止)为止。目前,我正在这样做

state = {

        startX:0

    }
changeX = () => {
        //console.log("changex")

        this.setState({startX: this.state.startX + (1/25)} , ()=>{
            console.log(this.state.startX)
            this.changeX()
        })
    }

<button onClick={this.changeX.bind(this)}>Change</button>

我说一个错误

Maximum update depth exceeded. This can happen when a component 
repeatedly calls setState inside componentWillUpdate or 
componentDidUpdate. React limits the number of nested updates 
to prevent infinite loops.

1 个答案:

答案 0 :(得分:0)

此错误是由react引发的,因为您是在没有退出条件的情况下递归调用this.changeX来产生stack overflow

基本上,您正在这样做:

function foo() {
  foo()
}

foo() 

这意味着,一旦您调用foo(),该Programm将永远运行,因为它不会停止自行调用。

这就像您有一个不间断的while(true)循环。

您可以使用以下方法避免此问题:

setInterval(function, timeout)

示例:

class SomeComponent extends React.Component {
  state = {
    x: 0
  }

  startAnimation = () => {
    const interval = setInterval(() => {
      this.setState({ x: this.state.x + 50 })

      if(x > 500) {
        clearInterval(interval) 
      }
    }, 50)
  }

  render() {
     return <button onClick={startAnimation}>Click me!</button>
  }
}

此示例将每50毫秒将x值更改为50。您可以随意调整这些值。但重要的是,如果setInterval函数中的if语句,则当值位于所需位置时,它将停止动画。

setInterval上的资源:https://www.w3schools.com/jsref/met_win_setinterval.asp