【问题标题】:React - I have to click a button three times for it to take effectReact - 我必须点击一个按钮三次才能生效
【发布时间】:2021-01-15 18:09:31
【问题描述】:

所以我正在尝试制作“Rock Paper Scissors”游戏,一切似乎都可以解决,但是当我点击一个按钮时,例如“Rock”,我必须点击它三次才能让它工作。

这是我的代码:

class RPSGame extends Component {
constructor(props) {
    super(props);
    this.state = {
        p1Option: 'rock',
        p2Option: 'rock',
        winner: 'Tie',
        winnerMsg: 'Its a Tie!'
    };
    this.handleClick = this.handleClick.bind(this);
    this.calculateWinner = this.calculateWinner.bind(this);
}
handleClick(e) {
    this.setState({ p1Option: e.option });
    this.calculateWinner();
}
calculateWinner() {
    let { p1Option, p2Option } = this.state;

    if (p1Option === p2Option) {
        this.setState({ winner: 'Tie' });
    } else if (
        (p1Option === 'rock' && p2Option === 'paper') ||
        (p1Option === 'paper' && p2Option === 'scissors') ||
        (p1Option === 'scissors' && p2Option === 'rock')
    ) {
        this.setState({ winner: 'Player Two' });
    } else if (
        (p1Option === 'rock' && p2Option === 'scissors') ||
        (p1Option === 'paper' && p2Option === 'rock') ||
        (p1Option === 'scissors' && p2Option === 'paper')
    ) {
        this.setState({ winner: 'Player One' });
    } else {
        console.log('error!');
    }
}

在我的渲染中:

    render() {
    const { handleClick } = this;
    const {  p1Option, p2Option } = this.state;
    return (
        <div>
            <h1>Rock Paper Scissors</h1>
            <p>Player 1 chose: "{p1Option}"</p>
            <p>Player 2 chose: "{p2Option}"</p>
            <button
                onClick={() =>
                    handleClick({
                        option: 'rock'
                    })}
            >
                Rock
            </button>
            <button
                onClick={() =>
                    handleClick({
                        option: 'paper'
                    })}
            >
                Paper
            </button>
            <button
                onClick={() =>
                    handleClick({
                        option: 'scissors'
                    })}
            >
                Scissors
            </button>
        </div>
    );
}

对不起,如果我的代码很庞大,但我只是从 React 开始,我打算在解决这个问题后缩短它。

提前致谢。

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    React 状态是异步的,这意味着当您调用 calculateWinner 时,您仍然没有函数范围内的最后推送状态。

    【讨论】:

    • 您可以简单地将函数作为第二个参数传递给 setState。此函数在您的状态发生突变后运行。 try this
    • 谢谢!给你们俩!,而不是在设置状态后传递calculateWinner,我将它作为第二个参数传递。
    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多