单击按钮时无法读取null的属性“ setState”

时间:2018-08-24 07:33:26

标签: javascript reactjs

我正在处理reactjs应用程序,并且在updateVert函数内部访问状态时遇到此问题。当我单击“播放”按钮时,将调用actionButton,并从actionButton内部调用updateVert。

下面是我的代码段

updateVert() {

        console.log("inside upver")
        if(play) {
            cancelAnimationFrame(this.updateVert);
            return;
        }

       this.setState({xPos: this.state.xPos + 1}, ()=>{
           if(this.state.xPos >= w) {
               // stop animation...
               this.setState({xPos:0, playing:false});
           }
           ctx.clearRect(0, 0, w, h);

           // draw new one...
           ctx.beginPath();
           ctx.strokeStyle = "#19f";
           ctx.lineWidth = 2;
           ctx.moveTo(this.state.xPos, 0);
           ctx.lineTo(this.state.xPos, 200);
           ctx.stroke();

           if(this.state.playing) {
               console.log("yes true")
               requestAnimationFrame(this.updateVert)
           };
       })
        // reset rectangle content to erase previous line...
    }

    actionButton(){
        if(this.state.playing) {
            // pause...
            this.setState({playing:false},()=>{
                console.log(this.state.playing)
            })
        }
        else {
            this.setState({playing:!this.state.playing},()=>{
                console.log(this.state.playing)
                this.updateVert();
            })

        }
    }

  render() {
        return (
            <div>
                <div className="App">
                    <canvas id="DemoCanvas" width="500" height="200"></canvas>
                </div>
                <button onClick={this.actionButton.bind(this)}>{this.state.playing ? "Stop":"Play"}</button>
            </div>


    );
  }

当我单击按钮(播放/暂停)时,出现错误提示

TypeError: Cannot read property 'setState' of null
updateVert
src/App.js:45
  42 |      return;
  43 |  }
  44 | 
> 45 | this.setState({xPos: this.state.xPos + 1}, ()=>{
  46 |     if(this.state.xPos >= w) {
  47 |         // stop animation...
  48 |         this.setState({xPos:0, playing:false}); 

我正确引用了updateVert函数。我在做什么错了?

3 个答案:

答案 0 :(得分:3)

您缺少绑定上下文this

actionButton(){钩子中,您正在调用this.updateVert(),该绑定没有与this绑定。因此,将其绑定到构造函数中:

this.updateVert.bind(this)

答案 1 :(得分:2)

它没有获得正确的this上下文。无需编写额外的代码进行绑定。您需要更改

updateVert() { .... }

updateVert = () => {.... }

答案 2 :(得分:-1)

尝试专门在 requestAnimationFrame

中绑定上下文
requestAnimationFrame(this.updateVert.bind(this))

希望这会有所帮助