“useEffect”钩子只触发一次?

2024-01-04

我正在为“React Native”开发一个猜测游戏,用户输入一个数字,手机尝试猜测它。每次手机生成猜测时,用户都可以单击“更大/更低”。当用户输入数字并且计算机猜测彼此相等时,我们将进入游戏结束屏幕。

游戏结束画面未渲染。在屏幕上渲染游戏的逻辑位于 useEffect() 内部

Problem

useEffect 在安装阶段只触发一次,再也不会触发?

  const { userSelectedNumber, onGameOver } = props;
  useEffect(() => {
    console.log(currentGuess, userSelectedNumber);
    if (currentGuess === userSelectedNumber) {
      onGameOver(rounds);
    }
  }, [userSelectedNumber, onGameOver]);*emphasized text*

(./screens/GameScreen.js)

我们应该退出游戏屏幕currentGuess === userSelectedNumber但这段代码只运行一次。

GameScreen 的完整代码如下:

import React, { useState, useRef, useEffect } from "react";
import { View, StyleSheet, Button, Text, Alert } from "react-native";

import NumberContainer from "../components/NumberContainer";
import Card from "../components/Card";

const randNumberGeneratorBetween = (min, max, exclude) => {
  min = Math.ceil(min);
  max = Math.floor(max);

  const randNum = Math.floor(Math.random() * (max - min)) + min;


  if (randNum === exclude) {
    return randNumberGeneratorBetween(1, 100, exclude);
  } else {
    return randNum;
  }
};

const GameScreen = props => {
  const [currentGuess, setCurrentGuess] = useState(
    randNumberGeneratorBetween(1, 100, props.userSelectedNumber)
  );
  const [rounds, setRounds] = useState(0);

  const currentLow = useRef(1);
  const currentHigh = useRef(100);

  const { userSelectedNumber, onGameOver } = props;

  useEffect(() => {
    console.log(currentGuess, userSelectedNumber);
    if (currentGuess === userSelectedNumber) {
      onGameOver(rounds);
    }
  }, [userSelectedNumber, onGameOver]);

  const nextGuessHandler = direction => {
    if (
      (direction === "lower" && currentGuess < props.userSelectedNumber) ||
      (direction === "greater" && currentGuess > props.userSelectedNumber)
    ) {
      Alert.alert("Don't Lie", "You know this is wrong", [
        { text: "Sorry", style: "cancel" }
      ]);
    }

    if (direction === "lower") {
      currentHigh.current = currentGuess;
    } else {
      currentLow.current = currentGuess;
    }
    const nextNumber = randNumberGeneratorBetween(
      currentLow.current,
      currentHigh.current,
      currentGuess
    );
    console.log('nextNumber',nextNumber);
    setCurrentGuess(nextNumber);

    setRounds(currRounds => currRounds + 1);
    console.log('currRound',rounds);

  };

  return (
    <View style={styles.screen}>
      <Text>Opponents Guess</Text>
      <NumberContainer>{currentGuess}</NumberContainer>
      <Card style={styles.buttonContainer}>
        <Button
          title="Lower"
          onPress={nextGuessHandler.bind(this, "lower")}
        ></Button>
        <Button
          title="Greater"
          onPress={nextGuessHandler.bind(this, "greater")}
        ></Button>
      </Card>
    </View>
  );
};

const styles = StyleSheet.create({
  screen: {
    flex: 1,
    padding: 10,
    alignItems: "center"
  },
  buttonContainer: {
    flexDirection: "row",
    justifyContent: "space-between",
    marginTop: 20,
    width: 300,
    maxWidth: "80%"
  }
});

export default GameScreen;

项目可以在这里找到:https://codesandbox.io/s/github/SMasood1/guessingGame?file=/screens/GameScreen.js:852-1039 https://codesandbox.io/s/github/SMasood1/guessingGame?file=/screens/GameScreen.js:852-1039


你需要添加rounds and currentGuess到 useEffect 挂钩中的依赖项数组

 useEffect(() => {
    console.log(currentGuess, userSelectedNumber);
    if (currentGuess === userSelectedNumber) {
      onGameOver(rounds);
    }
  }, [userSelectedNumber, onGameOver,currentGuess,rounds]);

此外,使用 props 初始化状态也被认为是一种反模式,因此我建议添加另一个 useEffect 钩子:

useEffect(()=>{
    setCurrentGuess(randNumberGeneratorBetween(1, 100, props.userSelectedNumber))

},[props.userSelectedNumber]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“useEffect”钩子只触发一次? 的相关文章

随机推荐

  • 以编程方式即时断电?

    在网络环境中的 Windows XP Pro 下 按 Ctrl Alt Del 会出现 Windows 安全提示 如果按住 Ctrl 并单击关机 则会触发紧急关机 这似乎关闭系统的速度如此之快 甚至没有进程完成 即几乎就像您刚刚拔掉电源 长
  • iOS 上的 Jquery mobile 1.4 页面底部的固定元素隐藏焦点上的输入文本

    你好 我正在使用 Jquery mobile 1 4 构建 cordova 3 应用程序 我的 Mac 上的 Safari 和 Chrome 对以下内容没有任何问题 但是当我在真实设备或 iOS 模拟器上部署并想要在字段中输入时 我会发现页
  • cmake 的全局默认设置

    有没有类似的东西MAKEFLAGS环境变量为cmake 设置一些全局默认值 例如CMAKE INSTALL PREFIX 不 CMake 没有类似的环境变量 您可以通过 CMake 中的环境变量设置的所有内容均已记录here https c
  • 检查数组是否包含另一个数组中的元素

    我有两个数组A 0 1 2 and B 2 1 0 如何检查A中的数字是否存在于B中 NOTE includes不是ES6 而是ES2016 Mozilla 文档 https developer mozilla org en US docs
  • logback登录时如何处理磁盘已满错误?

    我正在使用 slf4j logback 来登录我们的应用程序 早些时候我们使用的是jcl log4j 最近搬到了这里 由于我们的应用程序中的日志记录量很大 生产环境中可能会出现磁盘已满的情况 在这种情况下 我们需要停止日志记录 应用程序应该
  • virtualenv 与该系统或可执行文件不兼容

    我对 Linux Ubuntu 和安装 Python 软件包相当陌生 我在使用 mkvirtualenv 时遇到问题并且无法解决 mkvirtualenv mysite70 New python executable in mysite70
  • Word Addin/OfficeJS - 检测光标是否位于图表元素上

    我希望能够检查文档光标是否位于 MS Word API 内的图表元素内 现在我有一个插入文本的应用程序 但是当我尝试将所述文本插入图表标题时 它会删除图表并将其替换为我插入的内容控件 我不想删除图表 而是想通过上下文检查光标是否位于图表内部
  • JS Array a['1'] 不会给出错误

    我已经声明了一个数组a 1 2 3 4 5 当我写作时a 1 it 返回 2这很好 但是当我写的时候a 1 它也是给我 2而不是给出错误 我原以为那里会出现错误 为什么会有这样的行为 所有属性名称都是字符串 如果您传递一个数字 它会在用于查
  • PrimeFaces 单击逐行展开

    I have 行扩展 http www primefaces org showcase ui data datatable expansion xhtml数据表
  • 使用自定义 SKAction 的 EaseOut 操作

    我有以下自定义 SKAction 工作 但作为 EaseIn 而不是 EaseOut 我想让它缓出 我使用网络上找到的各种缓动方程来纠正它 却惨遭失败 let duration 2 0 let initialX cameraNode pos
  • 谁能破译这段代码?

    以下是我在访问日志中看到的一些奇怪代码示例 有人能解码这个吗 例如 xb3 xe1 xdd H t xd5 xd2 xf0ml xf1 x10 xee xa0 xeaY xa5 xe7 x81d xd5 x1f xd9 QI xd9 xfb
  • teamcity 中的 Mercurial VCS 证书验证失败

    我尝试使用 teamcity 配置 Mercurial 但出现以下错误 stderr 中止 错误 ssl c 504 错误 14090086 SSL例程 SSL3 GET SERVER CERTIFICATE 证书验证失败 尝试了以下签名证
  • 提交后台作业并用结果更新阶段

    我对 JavaFX 2 完全是个菜鸟 今天早上开始使用我正在改编的 HelloWorld 我需要使用后台线程的结果更新文本节点 对于 JavaFX2 我需要注意什么特别的地方吗 或者提交可调用对象并更新文本就足够了 指向教程的指针将不胜感激
  • 如何使用面向对象技术验证 PHP 中的表单字段

    我创建了一个 验证 类来验证两个字段 即 名字 和 姓氏 它工作不正常 当字段为空时它显示错误 但是当我提交包含非空字段的表单时 错误仍然存 在 如何在表单提交时执行此操作
  • 在node.js中分离文件服务器和socket.io逻辑

    我对 Node js 相当陌生 我发现随着项目规模的增长 将项目分成多个文件非常复杂 我之前有一个大文件 它既充当文件服务器又充当多人 HTML5 游戏的 Socket IO 服务器 理想情况下 我希望将文件服务器 socket IO 逻辑
  • 如何在同一活动中实现具有不同项目列表和不同点击操作的多个微调器

    我想在Android中实现两个不同的微调器 微调器有不同的数据集 这是带有年龄的微调器 它使用定义的包含所有年龄范围的字符串数组 例如18 20 19 21 etc
  • 如何使用 play 框架渲染一个简单的 html 页面?

    这是使用 play 框架版本 2 渲染纯 html 文件的方法吗 我不想将其放在 public 文件夹中 因为稍后会添加一些动态信息 这是我的解决方案 在路线中 我做了一些配置 如下所示 GET hello html controllers
  • 如何在Android中打开/关闭导航抽屉时立即刷新列表

    我已经创建了导航抽屉并在列表中显示项目 我的列表是静态的 但我正在显示点 因此 当用户选择列表中的项目并进行一些活动时 他就会获得积分 所以我想在他得到后立即更新积分 我怎样才能做到这一点 下面是我的代码 活动类别 Override pro
  • 在文本模式下的 Emacs 中设置 4 个空格缩进

    I ve been unsuccessful in getting Emacs to switch from 8 space tabs to 4 space tabs when pressing the TAB in buffers wit
  • “useEffect”钩子只触发一次?

    我正在为 React Native 开发一个猜测游戏 用户输入一个数字 手机尝试猜测它 每次手机生成猜测时 用户都可以单击 更大 更低 当用户输入数字并且计算机猜测彼此相等时 我们将进入游戏结束屏幕 游戏结束画面未渲染 在屏幕上渲染游戏的逻