Javascript 此状态未定义

Javascript 此状态未定义,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我很难弄清楚为什么这个.state是未定义的 第一次单击开始按钮时,将调用updateBoard和StartName。第一次调用StartName时,它运行正常,结束时状态发生更改,然后重新渲染电路板 在调用重新渲染组件后,启动setTimeout,并在1000毫秒后调用this.startName。一旦第二个StartName开始运行,我就会 TypeError:StartName函数中的第一个if未定义this.state 这是上面的代码 这是codepen的代码就在这里 您必须将star

我很难弄清楚为什么这个.state是未定义的

第一次单击开始按钮时,将调用updateBoard和StartName。第一次调用StartName时,它运行正常,结束时状态发生更改,然后重新渲染电路板

在调用重新渲染组件后,启动setTimeout,并在1000毫秒后调用this.startName。一旦第二个StartName开始运行,我就会

TypeError:StartName函数中的第一个if未定义this.state

这是上面的代码 这是codepen的代码就在这里

您必须将startGame绑定到构造函数中的App组件,以便该函数具有正确的词法作用域。在应用程序构造函数中:

constructor(props){
        super(props);
        this.state={
            newGame: true,
            gens: 0,
            nextGen: [],
            size: 0,
            board: [],
            running: false
        }
        this.startGame = this.startGame.bind(this)
      }
您必须将startGame绑定到构造函数中的App组件,以便该函数具有正确的词法作用域。在应用程序构造函数中:

constructor(props){
        super(props);
        this.state={
            newGame: true,
            gens: 0,
            nextGen: [],
            size: 0,
            board: [],
            running: false
        }
        this.startGame = this.startGame.bind(this)
      }

下面是一个更简单的问题示例:

课堂测试{ 建造师{ this.name=test } StartName{ console.logthis.name } 耽搁{ setTimeoutthis.startGame,1000 } } 设t=新测试
t、 startGame/这里有一个更简单的问题示例:

课堂测试{ 建造师{ this.name=test } StartName{ console.logthis.name } 耽搁{ setTimeoutthis.startGame,1000 } } 设t=新测试 t、 startGame/在componentDidMount方法中,您需要绑定this.startGame才能访问state。见下文:

componentDidUpdate() {
    var startGame = this.startGame;
    console.log(this.startGame);

    setTimeout(this.startGame.bind(this), 1000); // bound to `this`
}
这是因为setTimeout是异步的。

在componentDidMount方法中,您需要绑定This.startName才能访问state。见下文:

componentDidUpdate() {
    var startGame = this.startGame;
    console.log(this.startGame);

    setTimeout(this.startGame.bind(this), 1000); // bound to `this`
}

这是因为setTimeout是异步的。

他已经将StartName绑定到渲染方法中调用的位置。否-他为StartName属性绑定了它,但没有为setTimeout绑定。他已经将StartName绑定到渲染方法中调用的位置。否-他为StartName属性绑定了它,但没有为setTimeout绑定。很好的解释-不管是谁我没仔细阅读,谢谢!这是我使用的解决方案,因此我将其标记为正确答案。我想我的错误是我试图用函数{this.startGame}在ES5中编写一个匿名函数,但它不起作用。你太棒了!很好的解释——不管是谁否决了它,都没有仔细阅读。谢谢!这是我使用的解决方案,因此我将其标记为正确答案。我想我的错误是我试图用函数{this.startGame}在ES5中编写一个匿名函数,但它不起作用。你太棒了!