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然后显示在界面上没毛病啊?
你自己看!(甄嬛传滴血验亲语气)
它在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> </> ); };
另外也可以把自定义钩子函数的入参进行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报错信息之Expected an assignment or function call and
这篇文章主要介绍了React报错之Expected an assignment or function call and instead saw an expression,下面有两个示例来展示错误是如何产生的,需要的朋友可以参考下2022-08-08React报错之Parameter event implicitly has a
这篇文章主要为大家介绍了React报错之Parameter event implicitly has an any type,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-08-08React Native中导航组件react-navigation跨tab路由处理详解
这篇文章主要给大家介绍了关于React Native中导航组件react-navigation跨tab路由处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2017-10-10react中value与defaultValue的区别及说明
这篇文章主要介绍了react中value与defaultValue的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-05-05
最新评论