微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反应状态 = 了解更新后如何读取状态

如何解决反应状态 = 了解更新后如何读取状态

我非常精通 JavaScript,但正在学习 React。我正在尝试制作井字游戏。当我获胜时,我希望 this.state.message 立即更新, this.state.done 立即更改为 true,而 this.state.turn 不更改。目前我已经弄清楚了其中的一些,但没有了解 this.state.turn 的变化。它说错误的玩家获胜。我知道 setState 是异步的,这就是我无法一起更新这些内容的原因,我通过回调修复了其中的一些内容,但我正在努力寻找更好的方法并更好地理解所有内容

class Board extends Component {
    constructor(props) {
        super(props);
        this.state = {
            board: ['','',''],turn: 'O',message: 'O goes',done: false
        }
    }
    
    addItem(x) {
        if (this.state.done === true) {
            this.setState({message: this.state.turn + ' wins'});
            return;
        }
        let array = [...this.state.board];
        if (array[x] !== "") {
            return;
        }
        array[x] = this.state.turn;
        this.setState({board: array},() => {
            this.checkWinners(0,1,2);
            this.checkWinners(3,4,5);
            this.checkWinners(6,7,8);
            this.checkWinners(0,3,6);
            this.checkWinners(1,7);
            this.checkWinners(2,5,8);
            this.checkWinners(2,6);
            if (this.state.done === false) {                                        
                this.setState({turn: (this.state.turn === "X") ? "O" : "X"});
                this.setState({message: (this.state.message === "X goes") ? "O goes" : "X goes"});
            }
        });
    }
    
    checkWinners(a,b,c) {
        if ((this.state.board[a] === "X"
            &&
            this.state.board[b] === "X"
            &&
            this.state.board[c] === "X")
            ||
            (this.state.board[a] === "O"
            &&
            this.state.board[b] === "O"
            &&
            this.state.board[c] === "O"
            )
            ) {
            this.setState({done: true},() => {
                console.log('Winner');
                this.setState({message: this.state.turn + ' wins'});
            });

            }
    }
    
    render() {
        return (
            <>
            <h1>tic-tac-toe</h1>
            <h2>{this.state.message}</h2>
            <div className="board">
            {this.state.board.map((item,index) => (
                <div className="Boxes" key={index} onClick={() => this.addItem(index)}>{this.state.board[index]}</div>
            ))}
            </div>
            </>
        )
    }
}

解决方法

您可以尝试以下代码,只是更改了 checkWinners 函数的逻辑并注释掉了 this.setState({ message: this.state.turn + " wins" }); 行。 [注意:更改了一些 css 以在本地测试]

   constructor(props) {
        super(props);
        this.state = {
            board: ["","",""],turn: "O",message: "O goes",done: false,};
    }

    addItem(x) {
        if (this.state.done === true) {

            // this.setState({ message: this.state.turn + " wins" });
            return;
        }
        let array = [...this.state.board];
        if (array[x] !== "") {
            return;
        }
        array[x] = this.state.turn;
        this.setState({ board: array },() => {
            this.checkWinners(0,1,2);
            this.checkWinners(3,4,5);
            this.checkWinners(6,7,8);
            this.checkWinners(0,3,6);
            this.checkWinners(1,7);
            this.checkWinners(2,5,8);
            this.checkWinners(2,6);
            if (this.state.done === false) {
                this.setState({ turn: this.state.turn === "X" ? "O" : "X" });
                this.setState({
                    message:
                        this.state.message === "X goes" ? "O goes" : "X goes",});
            }
        });
    }

    checkWinners(a,b,c) {
        if( this.state.board[a] === "X" &&
            this.state.board[b] === "X" &&
            this.state.board[c] === "X"){
            this.setState({ done: true },() => {
                console.log("Winner");
                this.setState({ message: "X wins" });
            });
        }else if(this.state.board[a] === "O" &&
            this.state.board[b] === "O" &&
            this.state.board[c] === "O"){
            this.setState({ done: true },() => {
                console.log("Winner");
                this.setState({ message: "O wins" });
            });
        }
    }

    render() {
        return (
            <>
                <h1>Tic-Tac-Toe</h1>
                <h2>{this.state.message}</h2>
                <div className="board container" style={{height:"500px",width:"500px"}}>
                    <div className={"row"} style={{minHeight:"80%"}}>
                        {this.state.board.map((item,index) => (
                            <div
                                className="col-3 bg-secondary m-1"
                                key={index}
                                onClick={() => this.addItem(index)}
                            >
                                {this.state.board[index]}
                            </div>
                        ))}
                    </div>
                </div>
            </>
        );
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。