首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

React在等待API调用返回数据时实现活动轮子

基础概念

React 是一个用于构建用户界面的 JavaScript 库。在 React 中,当组件需要从 API 获取数据时,通常会使用异步请求(如 fetchaxios)来获取数据。在数据返回之前,组件会处于等待状态,这时可以使用加载指示器(如旋转的轮子)来提示用户数据正在加载。

相关优势

  1. 用户体验:加载指示器可以提高用户体验,让用户知道数据正在加载,而不是页面无响应。
  2. 避免空白页面:在数据加载完成前,显示加载指示器可以避免页面出现空白,提升视觉效果。
  3. 错误处理:可以结合加载指示器显示错误信息,提升应用的健壮性。

类型

  1. 简单加载指示器:如旋转的轮子、进度条等。
  2. 复杂加载动画:如复杂的 GIF 动画、自定义的 SVG 动画等。

应用场景

任何需要从 API 获取数据并在数据返回前显示加载状态的场景都适用,例如:

  • 数据列表页面
  • 搜索结果页面
  • 用户详情页面

实现方法

以下是一个简单的示例,展示如何在 React 组件中实现加载指示器:

代码语言:txt
复制
import React, { useState, useEffect } from 'react';
import axios from 'axios';

const DataFetchingComponent = () => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await axios.get('https://api.example.com/data');
        setData(response.data);
      } catch (err) {
        setError(err);
      } finally {
        setLoading(false);
      }
    };

    fetchData();
  }, []);

  if (loading) {
    return <div>Loading...</div>; // 这里可以替换为更复杂的加载指示器
  }

  if (error) {
    return <div>Error: {error.message}</div>;
  }

  return (
    <div>
      {data ? (
        <ul>
          {data.map(item => (
            <li key={item.id}>{item.name}</li>
          ))}
        </ul>
      ) : (
        <div>No data available</div>
      )}
    </div>
  );
};

export default DataFetchingComponent;

遇到的问题及解决方法

问题:加载指示器一直显示,数据未返回

原因

  1. API 请求失败:可能是网络问题或 API 端点错误。
  2. 数据处理错误:可能在数据处理过程中出现错误,导致数据未能正确设置。

解决方法

  1. 检查网络和 API 端点:确保 API 端点正确且网络连接正常。
  2. 调试数据处理逻辑:在 setDatasetError 处添加日志,查看数据是否正确获取和处理。
代码语言:txt
复制
try {
  const response = await axios.get('https://api.example.com/data');
  console.log('Data fetched:', response.data); // 添加日志
  setData(response.data);
} catch (err) {
  console.error('Error fetching data:', err); // 添加日志
  setError(err);
} finally {
  setLoading(false);
}

问题:加载指示器闪烁

原因

  1. 组件重新渲染:可能在数据加载完成前,组件多次重新渲染,导致加载指示器闪烁。

解决方法

  1. 使用 useCallbackuseMemo:确保在依赖项不变的情况下,避免不必要的重新渲染。
代码语言:txt
复制
const fetchData = useCallback(async () => {
  try {
    const response = await axios.get('https://api.example.com/data');
    setData(response.data);
  } catch (err) {
    setError(err);
  } finally {
    setLoading(false);
  }
}, []);

useEffect(() => {
  fetchData();
}, [fetchData]);

通过以上方法,可以有效解决 React 中等待 API 调用返回数据时实现活动轮子的相关问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

精读《react-snippets - Router 源码》

轮子就是应用核心原理 + 周边功能的堆砌,所以学习成熟库的源码往往会受到非核心代码干扰,Router 这个 repo 用不到 100 行源码实现React Router 核心机制,很适合用来学习。...下面该实现 navigate Link 了,他俩做的事情都是跳转,有如下区别: API 调用方式不同,navigate 是调用式函数,而 Link 是一个内置 navigate 能力的 a 标签。...但可惜的是,我们要做的 React Router 需要实现单页跳转逻辑,而单页跳转的 API history.pushState 并不会触发 popstate,为了让实现更优雅,我们可以 pushState...总结 从这个小轮子中可以学习到一下几个经验: 造轮子之前先想好使用 API,根据使用 API 反推实现,会让你的设计更有全局观。...实现 API ,先思考 API 之间的关系,能复用的就提前设计好复用关系,这样巧妙的关联设计能为以后维护减少很多麻烦。 即便代码无法复用的地方,也要尽量做到逻辑复用。

41410

Day3:Github项目每日优选之react-use

React hooks我相信很多同学已经门清了,这个库实现了基本上我们常见的所有自定义Hooks,需要哪个直接查看源代码复制到你的项目中,二次改一改,你的同事夸你666呢 Github是个巨大的仓库...useIdle — 跟踪用户是否处于非活动状态。...useTimeoutFn — 超时后调用给定函数。 useTween — 重新渲染组件,同时对从 0 到 1 的数字进行补间。 useUpdate —返回一个回调,它在调用时重新渲染组件。...useRafLoop — RAF 循环内调用给定的函数。 useSessionStorage — 管理 sessionStorage 中的值。...useDefault — 当 state 为 null 或 undefined 返回默认值。 useGetSet — 返回状态 getter get() 而不是原始状态。

1.7K30
  • 搞定混合开发面试,这一篇就够了!

    上面的定义是百度百科的官话,用白话文翻译就:所谓hybridApp就是app中嵌入web页面 兴起原因 之所以Hybrid App会兴起并且红极一, 其实段移动互联网产业的一种偶然。...衍生应用开发平台 针对 Cordova 存在的问题,一些厂商给出了一种优化方案,并且给出友好的文档,但是本质上还是 Cordova 的基础上做了以下几点改进: 以云平台的方式管理项目,整个开发周期除了写代码以外都能在平台上实现...年4月开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架 React 原生移动应用平台的衍生产物,支持iOS和安卓两大平台。...它不会生成原生 UI 组件,而是基于 ReactReact Native 是一个用于构建基于 Web 的交互界面的 JavaScript 库,因此会有更丰富的 UI 体验效果,同时也能够很好地调用底层框架的...window.JSBridge.foo(); //返回:'foo' //调用方法二 window.JSBridge.foo2('test');//返回:'foo2:test' 复制代码 iOS端 Native

    2.7K20

    React16 新特性

    ,这个回调函数返回的是真正渲染子组件的元素; 针对普通场景来说,react-call-return 有点过度设计的感觉,但是如果针对一些特定场景的话,它的作用还是非常明显,比如,渲染瀑布流布局,利用...React.createContext 是一个函数,它接收初始值并返回带有 Provider 和 Consumer 组件的对象; Provider 组件是数据的发布方,一般组件树的上层并接收一个数据的初始值...Suspense 作用是等待组件 suspend(暂停)渲染,并显示加载标识。...yield / async / await,其流程:调用 render 函数 -> 发现有异步请求 -> 暂停渲染,等待异步请求结果 -> 渲染展示数据。...如果有缓存则读取缓存数据,如果没有缓存,则会抛出一个异常 promise,利用异常做逻辑流控制是一种拥有较深的调用堆栈的手段,它是虚拟 DOM 渲染层做的暂停拦截,代码可在服务端复用。

    1.2K20

    83.精读《React16 新特性》

    ,这个回调函数返回的是真正渲染子组件的元素; 针对普通场景来说,react-call-return 有点过度设计的感觉,但是如果针对一些特定场景的话,它的作用还是非常明显,比如,渲染瀑布流布局,利用...React.createContext 是一个函数,它接收初始值并返回带有 Provider 和 Consumer 组件的对象; Provider 组件是数据的发布方,一般组件树的上层并接收一个数据的初始值...Suspense 作用是等待组件 suspend(暂停)渲染,并显示加载标识。...yield / async / await,其流程:调用 render 函数 -> 发现有异步请求 -> 暂停渲染,等待异步请求结果 -> 渲染展示数据。...如果有缓存则读取缓存数据,如果没有缓存,则会抛出一个异常 promise,利用异常做逻辑流控制是一种拥有较深的调用堆栈的手段,它是虚拟 DOM 渲染层做的暂停拦截,代码可在服务端复用。

    78240

    干货 | Qreact,去哪儿网的迷你react方案

    *视频由“IT大咖说”提供,时长约45分钟,请在WiFi环境下观看* 去哪儿网React Native深耕多年,对React内部实现的了解国内应该是非常领先的。...我们从今年1月份快速启动项目,1个月内大致完成了功能,Demo,并配合现有的复杂例子进行验收。本文将分享我们在做这轮子过程中的一些想法,包括竞品分析,实现思路,项目风险控制等等。...我们就不打算重造轮子,而是已有轮子上改改。 第一版是基于react-lite。这是因为react-lite是携程的工业聚大神写的,携程是我们的兄弟公司,应该比较好交流。...的对象,它会被框架的多个关键方法调用。...然后组件的render方法中,对于这部分的React Element每次返回相同的对象,并且在上面添加一个标记,碰到两个对象都有这个标记,就直接返回,不往下比较了。

    1K80

    React 服务端渲染完美的解决方案

    什么是服务器端渲染 使用 React 构建客户端应用程序,默认情况下,可以浏览器中输出 React 组件,进行生成 DOM 和操作 DOM。...具体使用方法,可以看我最近造的个轮子 kkt-ssr,这个轮子将工具的部分封装起来,你只需要写业务代码,和少量的服务端渲染代码即可,还附赠十几个示例,加上一个相对比较完善的示例react-router+...API两次的问题,服务端渲染,客户端展示渲染,平常调用一次API,现在调用了两次。...如果上面两种方式不在你的考虑范畴之内,那Rendora将是你完美的服务端渲染解决方案 总结 感觉我的轮子 kkt-ssr 好像白写了一样,经过分析发现目前还有一点作用吧,至少解决了不多调用一次API,和...API调用权限问题导致渲染不一致的问题。

    2.8K40

    React造轮系列:对话框组件 - Dialog 思路

    1.React轮子系列:Icon 组件思路 本轮子是通过 React + TypeScript + Webpack 搭建的,至于环境的搭建这边就不在细说了,自己动手谷歌吧。当然可以参考我的源码。...确定 API API 方面主要还是要参考同行,因为如果有一天,别人想你用的UI框架,你的 API 跟他之前常用的又不用,这样就加大了入门门槛,所以API 尽量保持跟现有的差不多。...运行效果: 4146730381-5ce8f8330e28e_articlex.gif 但有个问题,因为对话框的 visible 是由外部传入的,且 React 是单向数据流的,组件内并不能直接修改...从表格可以看出,modal 与其它两个只多了一个 retrun api,其实其它两个也可以返回对应的 Api,只是我们没去调用而已,所以补上: alert confirm modal onClose...参考 方应杭老师的React轮子课程

    3.6K20

    React快速入门

    和AngularJS相比,上手React简单到让人震惊。 引入React库之后,开发API就通过React对象暴露出来了。...React中,应用程序虚拟DOM上操作,这让React有了优化的机会。简单说, React每次需要渲染,会先比较当前DOM内容和待渲染内容的差异, 然后再决定如何最优地更新DOM。...React组件 React中定义一个组件也是相当的容易,组件就是一个 实现预定义接口的JavaScript类: React.createClass(meta) 参数meta是一个实现预定义接口的...meta中,至少需要实现一个render()方法,而这个方法, 必须而且只能返回一个有效的React元素。...简单的说,每当你需要使用createElement(), 就把这个函数调用部分用渲染目标HTML替换(提醒下,不完全一致,比如class属性 要用className代替): ?

    1K10

    面对极度复杂的前后端业务场景,使用 GraphQL 正确的姿势

    使用轮子过程中的注意事项 使用新轮子的问题(前端) 使用新轮子的过程中碰到的第一个问题就是在学习成本和团队适应方面。...比如多次请求触发导致返回结果为underfined,之所以会这样是由于第一个接口请求发送出去后,还在loading阶段,同一个接口又发送了第二次,导致返回数据发生冲突变成undefined。...此时一个要动态计算的字段被放在了一个基类中,多个Fragment中循环调用,甚至嵌套调用。这时候后端就可能接收到一个需要计算n方次动态计算的结果的请求,服务器的负载压力可想而知。...第一,虽然后端已经做了一些优化,但是还是没有完全实现前端的按需查询,当数据量达到一定级别的时候,数据库查询可能会成为性能瓶颈。...我们技术栈的选择上,web用的是React,App用的React Native,后端主要的API源是用Ruby写的,还有部分Python用来做数据分析,目前所有的API都被迁移到了GraphQL上。

    7.5K20

    精读《怎么用 React Hooks 造轮子

    销毁再次给一个默认标题即可,这个简单的函数可以抽象项目工具函数里,每个页面组件都需要调用。...:为了实现动画效果,需要依赖 rebound 库,它可以实现将一个目标值拆解为符合弹性动画函数过程的功能,那我们需要利用 React Hooks 做的就是第一次接收到目标值是,调用 spring.setEndValue...的回调函数返回值(仅执行一次),因此直接把回调函数返回值抛出来即可。...const update = useUpdate(); 实现:我们知道 useState 下标为 1 的项是用来更新数据的,而且就算数据没有变化,调用了也会刷新组件,所以我们可以把返回一个没有修改数值的...const isMounted = useIsMounted(); 实现:看到这里的话,应该已经很熟悉这个套路了,useEffect 第一次调用时赋值为 true,组件销毁返回 false,注意这里可以加第二个参数为空数组来优化性能

    2.4K40

    React 中后台系统多页签实现

    中后台管理类系统中,多页签的需求非常普遍,用户常常需要在多个页签内跳转,比如填写表单去查询某个列表获取一些字段信息再回到表单页面填写。...这样的需求 Vue 中使用 keep-alive 即可实现,但是 React 中,React Router 切换路由后就会卸载组件,而本身并没有提供类似 keep-alive 的功能,所以实现多页签的功能就会变得格外困难...看看社区其他人的理性分析: 社区用户反馈 三、方案选型 经过一番调研之后,基本的思路大概有三种: 使用 Redux,数据往 store 里面怼,实现页面数据的”缓存“。...解决了 react-router-cache-route React 15 版本报错问题之后,接下来的工作就是实现页签的 UI 和打开关闭的逻辑了,注意关闭需要调用 react-router-cache-route...的卸载缓存 API

    3.4K20

    Vite2+React+TypeScript:搭建企业级轻量框架实践

    异步的代码的处理:多个状态有前后依赖,很难处理他们的读写顺序; 本项目所有单文件组件都是React v16.8+ 的hooks写法,其考虑点主要在于本项目主要以工程框架介绍为主,hook写法能更好帮助组件的定义和抽离...Redux Toolkit React的状态管理库历来就是轮子重灾区,各种设计模式层出不穷,这里就不多介绍了。...项目不复杂,要求性能不高的直接用useContext、useReducer就行,简单也容易实现;假如你追求优秀的设计模式并且适配项目结构,直接基于Redux手写个轮子出来也行。...,规整服务端返回的retcode和message; 改写AxiosInstance的ts类型(由AxiosPromise→Promise),矫正调用方能正确判断返回数据的类型; 设置1个初始化函数...至此,我们就能愉快使用axios去请求数据了。 // api模块→请求中心 import { Request } from './request'; userInfo: (options?

    1.8K10

    【实战】1096- React 中后台系统多页签实现

    中后台管理类系统中,多页签的需求非常普遍,用户常常需要在多个页签内跳转,比如填写表单去查询某个列表获取一些字段信息再回到表单页面填写。...这样的需求 Vue 中使用 keep-alive 即可实现,但是 React 中,React Router 切换路由后就会卸载组件,而本身并没有提供类似 keep-alive 的功能,所以实现多页签的功能就会变得格外困难...看看社区其他人的理性分析: 社区用户反馈 三、方案选型 经过一番调研之后,基本的思路大概有三种: 使用 Redux,数据往 store 里面怼,实现页面数据的”缓存“。...解决了 react-router-cache-route React 15 版本报错问题之后,接下来的工作就是实现页签的 UI 和打开关闭的逻辑了,注意关闭需要调用 react-router-cache-route...的卸载缓存 API

    2.5K10

    Vite2+React+TypeScript:搭建企业级轻量框架实践

    异步的代码的处理:多个状态有前后依赖,很难处理他们的读写顺序; 本项目所有单文件组件都是React v16.8+ 的hooks写法,其考虑点主要在于本项目主要以工程框架介绍为主,hook写法能更好帮助组件的定义和抽离...Redux Toolkit React的状态管理库历来就是轮子重灾区,各种设计模式层出不穷,这里就不多介绍了。...项目不复杂,要求性能不高的直接用useContext、useReducer就行,简单也容易实现;假如你追求优秀的设计模式并且适配项目结构,直接基于Redux手写个轮子出来也行。...,规整服务端返回的retcode和message; 改写AxiosInstance的ts类型(由AxiosPromise→Promise),矫正调用方能正确判断返回数据的类型; 设置1个初始化函数...至此,我们就能愉快使用axios去请求数据了。 // api模块→请求中心 import { Request } from './request'; userInfo: (options?

    2.1K20

    95.精读《Function VS Class 组件》

    Class Component 展示的是修改后的值: Function Component 展示的是修改前的值: 那么 React 文档中描述的 props 不是不可变(Immutable) 数据吗...原因在于,虽然 props 不可变,是 this Class Component 中是可变的,因此 this.props 的调用会导致每次都访问最新的 props。...关于 React Hooks,之前的两篇精读分别有过介绍: 精读《React Hooks》 精读《怎么用 React Hooks 造轮子》 但是,虽然 Hook 已经发布了稳定版本,但周边生态跟进还需要时间...,调用了也会刷新组件,所以我们可以把返回一个没有修改数值的 setValue,这样它的功能就仅剩下刷新组件了。...,再利用 useRef 的可变特性,让 usePrevious 的返回值是 “上一次” Render 的。

    50620

    用于浏览器中视频渲染的时间管理 API

    因此我们不仅需要将场景的持续时间存储状态中,还要将活动的场景存在其中。当用户按下播放,我们需要计算活动场景是什么,哪些元素应该出现在画布上。...因此利用 React 来进行状态跟踪。React 擅长在依赖状态发生变化时重新运行函数。这样处理效果很好,但是也面临着性能问题。 由于 API 的设置问题,任何使用此链接的组件都会接受当前时间值。...这在方案一中并不是问题,因为我们只需要在每个需要时间的组件中运行一个循环,并且是 React 渲染循环之外运行它,当任何类型的派生状态发生变化时,都会调用一个设置状态来重新渲染组件,所以效率很高。...useTimeSelector 背后的想法是把昂贵运算改为廉价运算,当廉价运算返回相应结果再触发其他运算,在这种情况下计算的代价是重新渲染。...其工作原理类似于 useTimeSelector,可以向其传递一个函数,该函数在当前时间更改时调用,唯一的区别是 useTimeEffect 没有返回值。

    2.3K10

    如何使用 Router 为你页面带来更快的加载速度

    接下来的部分,我们已经路由定义数据请求和组件拆分开来,那么组件渲染中我们如何获取这部分数据请求返回数据。...当我们首次访问根路径,应用会同时触发根路径下的 loaderFunction 等待 loaderFunction 执行完毕后使用 loaderFunction 中返回数据进行页面渲染。...React Router 是如何实现 Defer 这一过程 Loaders 调用时机 上边的章节中我们讲到 ReactRouter 数据路由的优势以及如何在我们的站点中使用数据路由来优化我们的页面。...当然,当我们调用 usenavigate() 返回值跳转,同样也是通过 startNavigation 重新调用这一过程。...实际上这部分 Promise 的序列化是 Remix 的 组件中实现的: 页面初始化渲染,借助 和 __remixContext 的自定义 api实现了类似序列化的

    20710

    从 0 到 1 实现 React 系列 —— 5.PureComponent 实现 && HOC 探幽

    方法不会触发; 2.对象第一层数据发生改变(包括第一层数据引用的改变),render 方法会触发; PureComponent 的实现 照着上述思路我们来实现 PureComponent 的逻辑 function...HOC 实践 高阶组件(Higher Order Component) 不属于 React API 范畴,但是它在 React 中也是一种实用的技术,它可以将常见任务抽象成一个可重用的部分。...这个小节算是番外篇,会结合 cpreact(前文实现的类 react 轮子) 与 HOC 进行相关的实践。...顺带一提在这个 demo 中似乎看到了双向绑定的效果,但是实际中 React 并没有双向绑定的概念,但是我们可以运用 HOC 的知识点结合 setState React 表单中实现伪双向绑定的效果。...然后 render 中调用 super.render() 来调用父类的 render 方法。

    73510
    领券