为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 React 中的特定函数上添加延迟?

如何在 React 中的特定函数上添加延迟?

喵喔喔 2023-08-18 16:21:46
我构建了一个石头/剪刀/布 React 应用程序。该应用程序工作正常,我只是想在 CPU 必须选择武器(石头/布/剪刀)时添加一些延迟。我希望有一个时间窗口,CPU 选择的图像不会出现在屏幕上,而用户的选择会立即出现在屏幕上。我尝试在 compounentDidMount() 方法中添加 setInterval() 函数,但没有成功。如何仅在 CPU 部分添加延迟?https://codesandbox.io/s/nice-ardinghelli-96sum?file=/src/components/Main.js预先非常感谢您。
查看完整描述

4 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

您需要添加一个不渲染任何内容的状态。例如,只需将 cpu 选择设置为 4 并更新渲染函数。然后你可以像这里一样添加睡眠功能。我做了一些我认为你想要的工作示例
我对你的代码所做的主要更改是

this.sleep(1500).then(() => {

      const index = getRandomInt(3);

      this.setState({

        houseChoice: index

      });

      const results = this.getResults(choiceName, index).toUpperCase();

      this.setState({

        results: results

      });


      /*****************calling setScore()********************/

      if (results === "WIN") {

        this.props.setScore(1);

      } else if (results === "LOSE") {

        this.props.setScore(-1);

      } else {

        this.props.setScore(0);

      }

    });

其中handleClick执行超时。

在结果页面中我添加了


this.state.houseChoice === 2 ? (

             /*3*/

              <div

                className="elem-container result-container"

                style={{

                  borderColor: "hsl(349, 71%, 52%)",

                  color: "hsl(349, 70%, 56%)"

                }}

              >

                <img src={rock} className="choice-image" alt="img" />

              </div>

            ) : null


查看完整回答
反对 回复 2023-08-18
?
开满天机

TA贡献1786条经验 获得超12个赞

人类玩家选择一步棋后,不要立即让 CPU 选择一步棋。实现componentDidUpdate生命周期函数并将CPU的选择逻辑移到那里。这也需要移动对获胜逻辑的检查。


/*function that handles the user choice*/

handleClick = (

  choiceName,

  choiceImage,

  choiceBorderColor,

  choiceExtraBorderColor

) => () => {

  this.setState({

    onScreen: false,

    choiceName,

    choiceImage,

    choiceBorderColor,

    choiceExtraBorderColor

  });

};

一旦人类玩家选择了一个动作,就获得房子的随机动作,但不要立即将状态更新排入队列,而是稍后使用进入setTimeout更新状态。


仅当两个玩家都选择了移动但结果尚未计算并存储在状态中时才检查胜利。


componentDidUpdate(prevProps, prevState) {

  if (

    prevState.choiceName !== this.state.choiceName &&

    this.state.choiceName

  ) {

    function getRandomInt(max) {

      return Math.floor(Math.random() * Math.floor(max));

    }

    const index = getRandomInt(3);


    setTimeout(() => {

      this.setState({

        houseChoice: index

      });

    }, 2000);

  }


  if (

    this.state.choiceName &&

    [0, 1, 2].includes(this.state.houseChoice) && // We want 0 to be truthy :)

    !this.state.results

  ) {

    const results = this.getResults(

      this.state.choiceName,

      this.state.houseChoice

    ).toUpperCase();

    this.setState({

      results: results

    });


    /*****************calling setScore()********************/

    if (results === "WIN") {

      this.props.setScore(1);

    } else if (results === "LOSE") {

      this.props.setScore(-1);

    } else {

      this.props.setScore(0);

    }

  }

}

有条件地渲染“等待 CPU”UI


<h4 className="result-title">

  {this.state.houseChoice === ""

    ? "THE HOUSE CHOOSING"

    : "THE HOUSE PICKED"}

</h4>


{this.state.houseChoice === "" ? (

  <div>...</div>

) : this.state.houseChoice === 0 ? (

  /*1*/

  <div

    className="elem-container result-container"

    style={{

      borderColor: "hsl(230, 89%, 62%)",

      color: "hsl(230, 89%, 65%)"

    }}

  >

    <img src={paper} className="choice-image" alt="img" />

  </div>

) : this.state.houseChoice === 1 ? (

  /*2*/

  <div

    className="elem-container result-container"

    style={{

      borderColor: "hsl(39, 89%, 49%)",

      color: "hsl(40, 84%, 53%)"

    }}

  >

    <img src={scissors} className="choice-image" alt="img" />

  </div>

) : (

  /*3*/

  <div

    className="elem-container result-container"

    style={{

      borderColor: "hsl(349, 71%, 52%)",

      color: "hsl(349, 70%, 56%)"

    }}

  >

    <img src={rock} className="choice-image" alt="img" />

  </div>

)}

有条件地渲染结果并重试按钮。


<div className="final-result-container">

  {this.state.results && (

    <>

      <h1 className="bold">YOU {this.state.results}</h1>

      <TryAgain onClick={this.handleTryAgainClick} />

    </>

  )}

</div>

再次玩时不要忘记重置所有状态


handleTryAgainClick() {

  this.setState({

    onScreen: true,

    choiceName: "",

    choiceImage: "",

    choiceBorderColor: "",

    choiceExtraBorderColor: "",

    houseChoice: "",

    results: ""

  });

}

https://img1.sycdn.imooc.com//64df2a5c0001f9bc06380666.jpg

https://img1.sycdn.imooc.com//64df2a63000133d706400661.jpg

查看完整回答
反对 回复 2023-08-18
?
噜噜哒

TA贡献1784条经验 获得超7个赞

我不确定我的问题是否正确,但这里是,如果要在渲染上设置延迟,那么在做出选择之前不要渲染。如果应用程序必须在玩家输入后执行某些操作,请使用 async wait 异步执行以下操作。



查看完整回答
反对 回复 2023-08-18
?
忽然笑

TA贡献1806条经验 获得超5个赞

如果我猜对了,也许 lodash 的 Debounce 会为你提供答案。我在我的井字游戏应用程序中使用它来延迟计算机移动。只需从 NPM 添加即可

npm install lodash —save-dev

然后导入到你的文件中

import {debounce} from 'lodash';

不断创建将去抖的内容,您从 lodash 中调用了它。500 是时间,您想要移动延迟多少时间。在这种情况下,它将是 0.5 秒。

const debounceComputerMove = debounce(()=>{
  computerMove();
},500);

然后当你想调用computerMove函数时,调用debounceComputerMove而不是computerMove()


查看完整回答
反对 回复 2023-08-18
  • 4 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信