react实现每隔60s刷新一次接口的示例代码

 更新时间:2023年06月02日 16:11:22   作者:霍格沃茨魔法师  
本文主要介绍了react实现每隔60s刷新一次接口的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

首先:不喜勿喷。3Q。祝您生活愉快。

Q: 为什么突然想写这个demo?

A: 是因为我在练习自定义hook时想要写个例子,而这个场景是我真实遇见的。

如今想要用一种自定义hook实现该demo,而不是直接设置60s定时器再次请求接口。

我要实现的场景是:

页面只挂载一次不会再次刷新页面的情况下,实现每隔1min便会更新一下数据。

demo搭建

假如说,我想实现的就是每60s就改变一下count,使其+1。

且只挂载一次页面还要实现60s更新,那么如果我这么写呢?

const [count, setCount] = useState(0);
useEffect(() => {
  const interval = setInterval(() => {
  console.log(count)
    setCount(count+1)
  }, 60000);
    return () => clearInterval(interval);
},[])
  return (
       <>
          <div>count计数器: {count}</div>
       </>
);

你觉得行吗?看起来好像没什么问题,每个60s使count+1然后显示在界面上没毛病啊?

你自己看!(甄嬛传滴血验亲语气)

动画.gif

它在dom中显示的count已经被挂载+1,而钩子函数中的count打印出的始终为0,不会进行+1的操作。

那我怎么实现更新数据啊??

我想到的是通过赋值ref.current来存储数据的更新,于是定义了一个钩子函数将原来的count就挂载到ref.current中,此后的每次更新都在ref的基础上,那么看下书写倒是很简单了。

export const useLatestValue = (value) => {
  const ref = useRef(value);
  ref.current = value;
  return ref;
};
只需要将count入参useLatestValue(count)即可开启ref挂载之路。

那么回到定时器中继续补全:

export default () => {
  const [count, setCount] = useState(0);
  const ref = useLatestValue(count);
  useEffect(() => {
    const interval = setInterval(() => {
      console.log("count:", count);
      setCount(ref.current + 1);
    }, 60000);
    return () => clearInterval(interval);
  }, []);
  return (
    <>
      <div>count计数器: {count}</div>
    </>
  );
};

动画.gif

另外也可以把自定义钩子函数的入参进行ts类型约束,由于该钩子函数可能会作为一个公共函数来使用,所以无论入参为什么形式,都需要保证出参都是相同的类型,那么这种情况就用到了泛型。

    export const useLatestValue = <T>(value:T):{current:T} => {
      const ref = useRef(value);
      ref.current = value;
      return ref;
    };

线上书写:

原始实现方法:直接在定时器中请求接口:

function ApiRefresh() {
  // 初始化为null,避免渲染时出现undefined的情况
  const [apiResponse, setApiResponse] = useState<ApiResponse | null>(null); 
  const [loading, setLoading] = useState(false); // 控制loading状态
    // 显示接口返回值的姓名,如果为空则显示Loading...
  return <div>{apiResponse ? apiResponse.name : "Loading..."}</div>; 
}

在组件加载完成后,通过setInterval定时刷新接口数据

interface ApiResponse {
  // 假设接口返回的是一个包含name和age字段的对象
  name: string;
  age: number;
}
function ApiRefresh() {
  const [apiResponse, setApiResponse] = useState<ApiResponse | null>(null);
  const [loading, setLoading] = useState(false);
  // 在组件加载完成后,每隔60s刷新一次接口
  useEffect(() => {
    setLoading(true); // 刷新时,显示loading状态
    const timer = setInterval(() => {
      axios.get<ApiResponse>("https://example.com/api").then(response => {
        setApiResponse(response.data);
        setLoading(false); // 刷新完成后,隐藏loading状态
      });
    }, 60000);
    // 组件卸载时,清除定时器
    return () => clearInterval(timer);
  }, []);
  return <div>{apiResponse ? apiResponse.name : (loading ? "Loading..." : "")}</div>;
}

在上面的代码中,我们使用useEffect钩子来监听组件的创建和销毁,然后在组件创建时初始化定时器,使用setInterval函数每隔60s发送一次请求并更新状态,而在组件销毁时则清除定时器,避免不必要的网络请求。同时,我们也处理了接口数据的加载状态,避免用户等待时看到空白界面。

到此这篇关于react实现每隔60s刷新一次接口的示例代码的文章就介绍到这了,更多相关react刷新接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React Native开发封装Toast与加载Loading组件示例

    React Native开发封装Toast与加载Loading组件示例

    这篇文章主要介绍了React Native开发封装Toast与加载Loading组件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • React报错解决之ref返回undefined或null

    React报错解决之ref返回undefined或null

    最近使用react做个滚动监听获取更多数据效果,当想获取dom时发现怎么也获取不到,下面这篇文章主要给大家介绍了关于React报错解决之ref返回undefined或null的相关资料,需要的朋友可以参考下
    2022-08-08
  • react 原生实现头像滚动播放的示例

    react 原生实现头像滚动播放的示例

    这篇文章主要介绍了react 原生实现头像滚动播放的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • react-router 路由切换动画的实现示例

    react-router 路由切换动画的实现示例

    这篇文章主要介绍了react-router 路由切换动画的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 详解React组件卸载怎么中止递归方法

    详解React组件卸载怎么中止递归方法

    最近在处理项目代码的时候,出现了一个bug,组件中的方法在组件卸载后仍然在执行,代码片段发给我看,但是变量的用意我也不懂,只看到有方法调用自身方法,这不就是递归嘛,所以本文详细给大家介绍了React组件卸载怎么中止递归方法,需要的朋友可以参考下
    2024-01-01
  • React Redux管理库示例详解

    React Redux管理库示例详解

    这篇文章主要介绍了如何在React中直接使用Redux,目前redux在react中使用是最多的,所以我们需要将之前编写的redux代码,融入到react当中去,本文给大家详细讲解,需要的朋友可以参考下
    2022-12-12
  • 聊一聊我对 React Context 的理解以及应用

    聊一聊我对 React Context 的理解以及应用

    这篇文章主要介绍了聊一聊我对 React Context 的理解以及应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • React Native中导航组件react-navigation跨tab路由处理详解

    React Native中导航组件react-navigation跨tab路由处理详解

    这篇文章主要给大家介绍了关于React Native中导航组件react-navigation跨tab路由处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • 浅谈React高阶组件

    浅谈React高阶组件

    这篇文章主要介绍了浅谈React高阶组件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • React中的跨组件通信的几种常见方法

    React中的跨组件通信的几种常见方法

    在React中,跨组件通信有几种常见的方式,每种方式适用于不同的场景,下面是几种常见的跨组件通信方法,感兴趣的朋友一起看看吧
    2025-04-04

最新评论