javascript - setState 更新挂载状态

标签 javascript reactjs setstate

在编写康威的生命游戏时,我收到一个错误,状态实际上并未更新。我收到一条警告:setState(...): Can only update a Mounted or Mounting component.,但到目前为止我尝试过的所有方法都没有帮助。您可以在下面找到我的应用程序组件:

class App extends React.Component {
constructor(props) {
    super(props);
    this.state = {
        board: [],
        rows: 50,
        cols: 50,
        cycles: 0
    }
    this.createBoard();
}

createBoard() {
    var newBoard = [];
    for (var i = 0; i < this.state.rows; i++) {
        var row = [];
        for (var j = 0; j < this.state.cols; j++) {
            let fillValue;
            if (Math.random() > 0.65) {
                fillValue = true;
            } else {
                fillValue = false;
            }
            row.push(fillValue);
        }
        newBoard.push(row);
    }
    console.log(newBoard);
    this.setState({board: newBoard});
}

render() {
    return(
        <div id="root">
            <h1>Conway's Game of Life</h1>
            <Controller />
            {console.log(this.state.board)}
            <Board
                board={this.state.board}
                rows={this.state.rows}
                cols={this.state.cols}
            />
            <p>Years Passed: {this.state.cycles}</p>
        </div>
    );
}
}

问题出在 createBoard() 函数末尾的 setState。 setState 上面的 console.log 打印效果很好,但 render 方法中的另一个打印出一个空数组。

最佳答案

更改调用 createBoard() 方法的位置可以修复此错误。我没有调用方法是构造函数,而是将其移至 componentDidMount 请注意,您的两个组件 BoardController 代码中缺失,因此我已将其注释掉

这是代码

class TestJS extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            board: [],
            rows: 50,
            cols: 50,
            cycles: 0
        };
        this.createBoard = this.createBoard.bind(this);
    }

    componentDidMount(){
        this.createBoard();
    }

    createBoard() {
        var newBoard = [];
        for (var i = 0; i < this.state.rows; i++) {
            var row = [];
            for (var j = 0; j < this.state.cols; j++) {
                let fillValue;
                if (Math.random() > 0.65) {
                    fillValue = true;
                } else {
                    fillValue = false;
                }
                row.push(fillValue);
            }
            newBoard.push(row);
        }
        console.log(newBoard);
        this.setState({board: newBoard});
    }

    render() {
        return(
            <div id="root">
                <h1>Conway's Game of Life</h1>
                {console.log(this.state.board)}
                <p>Years Passed: {this.state.cycles}</p>
            </div>
        );
    }
}

export default TestJS;

关于javascript - setState 更新挂载状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49143859/

相关文章:

javascript - 如何修复 不要直接改变状态。将 setState() 与数组一起使用?

javascript - React JS 中 PrevState 不会立即更新状态值

javascript - jquery if css height > Xpx 这样做

javascript - JavaScript 中的全局/嵌套函数是作为闭包实现的吗?

javascript - JavaScript 中变量的全局声明

javascript - javascript 客户端中的服务器端数据绑定(bind)

javascript - 将自定义参数传递给react-router onEnter函数

javascript - Chain React setState 回调

reactjs - 如何使用 Cypress 访问 React 组件本地状态?

javascript - 如何在 Redux 中集成 FileReader?