React hooks useEffect 第二次调用 API 和第一次调用 API 响应也返回

2023-12-09

我正在使用 useEffect 获取 API,并且 API 响应正确,例如

{response: {message: "This is a image link", status: "success"}, error: null}

第二次,当我收到下一个 API 调用响应时,如果出现错误,则旧响应不会被删除。显示是这样的

{response: {message: "This is a image link", status: "success"}, error: TypeError}

我工作this获取API的教程代码

检查我的确切代码代码沙箱

import React, { useState } from "react";
import ReactDOM from "react-dom";
import "./styles.css";

const useFetch = (url, options) => {
  console.log("useFetch");
  const [response, setResponse] = React.useState(null);
  const [error, setError] = React.useState(null);

  React.useEffect(() => {
    const FetchData = async () => {
      try {
        const res = await fetch(url, options);
        const json = await res.json();
        setResponse(json);
        // console.log("json - ", json);
      } catch (error) {
        // console.log("error - ", error);
        setError(error);
      }
    };
    FetchData();
  }, [url]);
  return { response, error };
};

function App() {
  const API_URL = `https://dog.ceo/api/breeds/image/random`;
  const [apiUrl, setApiUrl] = useState(API_URL);
  const res = useFetch(apiUrl, {});
  console.log("res - ", res);
  if (!res.response) {
    return <div>Loading...</div>;
  }

  const apiCallAgain = () => {
    const apiUrl = `https://d.ceo/api/breeds/image/q`;
    setApiUrl(apiUrl);
  };
  const dogName = res.response.status;
  const imageUrl = res.response.message;
  return (
    <div className="App">
      <div>
        <button onClick={apiCallAgain}>API Call</button>
        <h3>{dogName}</h3>
        <div>
          <img src={imageUrl} alt="avatar" />
        </div>
      </div>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

打开控制台并检查res默认对象。现在点击API Call按钮并检查res再次反对。当我使用 useState 时null那么为什么在开始时会显示旧状态?


当组件重新渲染时,钩子不会重新初始化其中的所有状态。如果是这种情况,状态就不能不起作用(当您更改状态时组件会重新呈现)。

相反,对于每个渲染,useStatehook 存储并返回该渲染的特定值。在你的情况下,当API_URL变化,useEffect重新运行,但状态变量不重新运行。

来自docs:

这是一种在函数调用之间“保留”某些值的方法 - useState 是一种使用与 this.state 在一个类中提供。通常,变量会“消失” 函数退出,但状态变量被 React 保留。

解决此问题的方法是重置响应和错误的状态useEffect:

 React.useEffect(() => {
    setResponse(null);
    setError(null);
    const FetchData = async () => {
      try {
        const res = await fetch(url, options);
        const json = await res.json();
        setResponse(json);
        // console.log("json - ", json);
      } catch (error) {
        // console.log("error - ", error);
        setError(error);
      }
    };
    FetchData();
  }, [url]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React hooks useEffect 第二次调用 API 和第一次调用 API 响应也返回 的相关文章

  • 卸载 React 时删除事件监听器

    我有更高阶的组件 反应如下 export default function InnerComponent class InfiniteScrolling extends React Component constructor props s
  • 由于 apollo-client 未定义,无法解构 GraphQL 查询?

    我正在寻找调试与错误消息相关的问题 未捕获的类型错误 无法解构 0 apollo client WEBPACK IMPORTED MODULE 4 useQuery 因为它未定义 Context 我正在为我的 React js 项目设置后端
  • 如何让 Django 和 ReactJS 协同工作?

    New to Django and even newer to ReactJS I have been looking into AngularJS and ReactJS but decided on ReactJS It seemed
  • 在 ReactJS 中创建动态目录

    我有一个组件 它代表一个页面 其中有多个SectionHeader 组件作为该页面的子组件 我想通过检查 Page 的子项 SectionHeaders 来动态创建目录
  • 陷入了 React useEffect 的一系列变化

    我正在反应中创建一个表单生成器 在一个简单的文本字段上 我需要 Change currentValue When currentValue已更改 验证它 验证完成后 发出一个事件 有效或无效 这是我的代码 const TextInput p
  • redux 是否会在对存储进行任何更新时评估存储的所有侦听器?

    据我所知 当商店中的任何内容发生变化时 redux 都会通知商店的所有订阅者 无论是对深层嵌套叶子的订阅还是对状态顶层的订阅 在您遵循指导原则的应用程序中 许多单独的组件应该连接到商店 而不是仅仅几个 docs https redux js
  • Next.js - 如何使用 Provider 来包装路由并使用 Context 和 Hooks

    我在 create react app 中编写了类似于以下的代码 我想知道 next js 的等效代码 下面的代码是我尝试拥有一个可用于所有页面的全局上下文 提供者包装链接 我没有收到任何错误 问题出在里面about当我期望上下文状态时 页
  • React.memo 与反应中的打字稿

    我在 tsx 文件 React typescript 中使用 React memo 现在我已经将 Props 的接口声明为 interface Props type string 我的组件看起来像 const Component React
  • SWC with JavaScript:如何处理 CSS 导入以及如何绝对导入?

    TL DR 如何告诉 SWC 编译 React 组件中导入的 CSS 文件 如何告诉 SWC 在测试和 React 组件中编译绝对导入 这是一个最小的可重现示例 https github com janhesters riteway swc
  • 具有多种布局的 React Router v4

    我想在我的公共布局中渲染一些路线 并在我的私人布局中渲染一些其他路线 有没有一种干净的方法可以做到这一点 显然不起作用的示例 但我希望大致解释我正在寻找的内容
  • React:在哪里扩展对象原型

    我使用创建了一个纯 React 应用程序创建反应应用程序 https github com facebookincubator create react app 我想延长String类并在一个或多个组件中使用它 例如 String prot
  • React:设置 State 或设置 Prop 而无需重新渲染

    Problem 目前 我有一个LoginForm具有 成功 处理函数的组件handleOnSuccess 然后将其链接到父组件onTokenUpdate由 令牌更新 处理函数定义的属性handleUpdateToken 问题是setStat
  • 嵌套对象的 setState

    我有一个嵌套对象作为状态 并且在组件中有一个表单 我正在考虑每次用户在表单中输入某些内容时更新状态 并且为了避免为每个输入创建许多函数 我正在考虑使用 switch 创建单个函数 使用 switch 创建单一函数是个好主意吗 如何更新对象的
  • 将 useRef 挂钩传递给 ref 属性的正确方法

    我不确定如何更明确地提出这个问题 但它是关于值传递 and 引用传递反应中的情况 还有胡克斯 我正在使用 gsap 来制作 div 滑入和滑出的动画 这是其上下文 但我猜测 ref 的用途并不重要 因此 这工作得很好 尽管这是一种更典型的类
  • React/Redux bundle.js 太大

    我有一个小型的 React 项目 Webpack生成的bundle js大小为6 3Mb 如何将大小减小到 github webpack config js module exports devtool inline source map
  • 如何测试 google.maps.Geocoder?

    你好 我正在尝试编写一个 简单 测试来检查反应类组件状态更改 具体来说 我正在测试如果 Google 成功对我发送的某些字符串 地址 进行地理编码 lat 纬度 和 lng 经度 状态是否会发生变化 这是我想测试的示例 i e the la
  • Firebase 托管部署失败

    Running firebase deploy在给我一个超时错误之前会运行几分钟Error ESOCKETTIMEDOUT 我之前已经成功部署了多次 除了项目的前端 用 React 编写 之外 没有更改任何内容 我有一个单独的文件夹 其中包
  • firebase :: 无法读取 null 的属性“props”

    你好 我正在尝试将react router与firebase一起使用 但它给了我这个错误 无法读取 null 的属性 props 这正是代码 我正在其中使用我的反应路由器 向下代码位于作为登录面板组件的组件上 else if this em
  • 在 React 中实现 Google 登录错误 -

    我正在尝试在 React 中实现 google 登录 这是我的组件 import Fragment useEffect from react import GOOGLE CLIENT ID from some file const Goog
  • 如何在 Swiper 实例之外使用 useSwiper?

    我在用着用于 React 的滑动器 https swiperjs com react显示一些幻灯片 我一直坚持使用外部按钮在幻灯片 上一张和下一张 之间导航 刷卡器有一个useSwiper hook https swiperjs com r

随机推荐

  • django-debug-toolbar 没有显示

    我看了其他问题 但无法弄清楚 我执行了以下操作来安装 django debug toolbar pip 安装 django debug toolbar 添加到中间件类 MIDDLEWARE CLASSES django middleware
  • Bash 脚本超级慢

    我正在更新一个旧脚本来解析 ARP 数据并从中获取有用的信息 我们添加了一个新的路由器 虽然我可以从路由器中提取 ARP 数据 但它采用了新的格式 我有一个文件 zTempMonth 它是来自两组路由器的所有 arp 数据 我需要将其编译成
  • 对 XML 文档的各个部分进行数字签名

    我有一个 XML 文档 其结构类似于以下内容
  • jsf 模板中的后台 url 路径

    我在这里遇到麻烦了 我有一个 JSF 应用程序 它有一个名为的模板文件基本模板 xhtml 该文件位于 resources template 文件夹中 遵循文件代码
  • 如何在从datalab运行的数据流管道中使用谷歌云存储

    我们一直在 datalab 中运行一个 Python 管道 该管道从 google 云存储中的存储桶中读取图像文件 导入 google datalab storage 最初我们使用 DirectRunner 效果很好 但现在我们尝试使用 D
  • 为什么 python max('a', 5) 返回字符串值?

    追溯一个ValueError cannot convert float NaN to integer我发现该行 max a 5 max 5 a 将返回a而不是 5 在上面的例子中我使用了示例字符串a但在我的实际情况下 字符串是NaN 拟合过
  • Spring中如何在请求参数中发送特殊字符

    如何处理请求参数中的特殊字符 这是我的控制器 Scope request RestController public class GetOperatorSeries RequestMapping value test method Requ
  • 为什么易失性不能正常工作

    今天我正在使用以下命令创建一项超时作业TimerTask但遇到了一个新问题 我有一个static volatile boolean多变的flag 我的理解是 一旦这个变量的值发生变化 所有正在运行的都会通知它thread 但是当我运行这个程
  • 模拟 Java 输入流

    请提供指针来帮助我模拟 java InputStream 对象 这是我希望模拟的代码行 InputStreamReader inputData new InputStreamReader System in bufferdReader ne
  • 在sql server中执行python脚本

    Experts 只是好奇想知道 有没有办法在任何sql服务器中执行python脚本 如果是这样 请给我提供一些参考链接 要在 sql server 中执行 python 脚本 请参考此question 欲了解更多详细信息 请阅读此内容doc
  • Angular2 Beta 依赖注入

    我有一个加载 QApi 服务的 NavBar 组件 QApi 服务加载 UserService 但出现以下错误 EXCEPTION No provider for UserService NavBarComponent gt QApi gt
  • 如何让Android Service与Activity通信

    我正在编写我的第一个 Android 应用程序 并试图了解服务和活动之间的通信 我有一个服务将在后台运行并执行一些 GPS 和基于时间的日志记录 我将有一个用于启动和停止服务的活动 因此 首先 我需要能够确定活动启动时服务是否正在运行 这里
  • iPhone 所有视图控制器都有一个标题

    我有一个带有选项卡栏控制器 带有 4 个视图控制器 的应用程序 它包含一个导航控制器 所有这些都是以编程方式创建的 我的问题 有没有一种方法可以为所有视图控制器设置一个导航栏标题 例如 当我切换选项卡时 标题是相同的 对我来说理想的解决方案
  • 在 SELECT 列表中的其他位置引用别名

    我有以下查询 select FirstName LastName Case When LastName Jones then N A End as Other Case When Other is not null then 1 else
  • 为什么这些 apt 软件包在 Ubuntu 和 Heroku 上的行为不一样?

    我想用ZBar从Python开始Heroku 在常规 Ubuntu 14 04 服务器上我可以运行 sudo apt get install python qrtools OR sudo apt get install zbar tools
  • 如何使用 ASP.NET 解析 JSON 字符串?

    我正在使用 Sendgrid API 发送和检索已发送邮件的统计信息 我想将 API 的响应存储在数据库中 protected void btnBounces Click object sender EventArgs e try stri
  • android java.lang.IllegalStateException:无法从 CursorWindow 读取第 0 行、第 0 列

    我正在开发一个应用程序 它下载一些文件并将其文本保存在 file content 字段中到数据库中 文件大小可以从几 KB 到 10 MB 不等 该应用程序在保存时适用于所有尺寸 在长 file content 记录上使用 select 语
  • Plotly:带有下拉菜单的散点图,用于更改数据和计算注释

    我正在尝试制作一个带有 2 个下拉菜单的散点图 用于选择要绘制 x 轴和 y 轴的数据列 来自 pandas 数据框 我还希望该图具有随下拉选择而变化的相关统计注释 因为注释是根据 x 和 y 数据作为参数计算的 我已经成功地使用下面的代码
  • 使用操作按钮刷新主面板屏幕

    我正在构建一个闪亮的应用程序 我想刷新主面板屏幕 这是示例代码 我有一个提交按钮来显示数据 我有一个刷新按钮来清除屏幕 我不太确定如何在 R 和闪亮中编写重新刷新按钮的代码 因为我对此很陌生 感谢您的关注 library DT ui lt
  • React hooks useEffect 第二次调用 API 和第一次调用 API 响应也返回

    我正在使用 useEffect 获取 API 并且 API 响应正确 例如 response message This is a image link status success error null 第二次 当我收到下一个 API 调用