当前位置:首页 > 科技  > 软件

React Query 的 useQuery 竟也内置了分页查询支持!

来源: 责编: 时间:2024-06-27 17:19:16 263观看
导读本次我们将继续 useQuery() API 的学习,着重讲述 useQuery() 在分页上的优化能力[3]。基本分页功能实现项目中通常会遇到分页查询的需要,通过之前的学习,我们会写出这样的代码。function Example() { const [page, setP

本次我们将继续 useQuery() API 的学习,着重讲述 useQuery() 在分页上的优化能力[3]。6Yl28资讯网——每日最新资讯28at.com

基本分页功能实现

项目中通常会遇到分页查询的需要,通过之前的学习,我们会写出这样的代码。6Yl28资讯网——每日最新资讯28at.com

function Example() {  const [page, setPage] = useState(1)  const { isLoading, isError, error, data: posts } = useQuery(    ['posts', page],    () => axios.get('https://jsonplaceholder.typicode.com/posts', { params: { _page: page, _limit: 6 } })  )  return (    <div>      <h2>Posts(第{page}页)</h2>      {        isLoading && <p>Loading....</p>      }      {        isError && <p>An error has occurred: {error.message}</p>      }      <ul>        {          posts?.data.map(post => (            <li key={post.id}>{post.title}</li>          ))        }      </ul>      <div style={{ display: 'flex', gap: '8px' }}>        <button disabled={isLoading} onClick={() => setPage(prePage => Math.max(0, prePage - 1))}>Previous Page</button>        <button disabled={isLoading} onClick={() => setPage(prePage => prePage + 1)}>Next Page</button>      </div>    </div>  )}

浏览器访问:6Yl28资讯网——每日最新资讯28at.com

图片图片6Yl28资讯网——每日最新资讯28at.com

点击“Next Page”查看下一页数据。6Yl28资讯网——每日最新资讯28at.com

图片图片6Yl28资讯网——每日最新资讯28at.com

确实也实现了功能,不过体验上不好的地方在于,每次切换到新一页数据时,中间会间隔一个“Loading...”效果,导致页面闪动。6Yl28资讯网——每日最新资讯28at.com

为了不然页面闪动,我们可以考虑在加载新页面数据时,同时保留旧数据的展示不就行了吗?后面一旦新数据到了,直接替换就行。6Yl28资讯网——每日最新资讯28at.com

useQuery() API 可考虑到了这方面的使用体验,于是便提供了一个 keepPreviousData 选项。6Yl28资讯网——每日最新资讯28at.com

保留旧数据的分页功能

我们在之前案例的基础之上,调用 useQuery() 时,指定 keepPreviousData: true 选项。6Yl28资讯网——每日最新资讯28at.com

const { isLoading, isError, error, data: posts } = useQuery(  ['posts', page],  () => axios.get('https://jsonplaceholder.typicode.com/posts', { params: { _page: page, _limit: 6 } }),  {    keepPreviousData: true  })

刷新页面,再来看看加载新页的效果。6Yl28资讯网——每日最新资讯28at.com

图片图片6Yl28资讯网——每日最新资讯28at.com

发现页面不再闪动了。6Yl28资讯网——每日最新资讯28at.com

不过,这种状态下的中间状态我们还要细致的控制一下,比如请求过程中禁用按钮的点击能力。6Yl28资讯网——每日最新资讯28at.com

- const { isLoading, isError, error, data: posts } = useQuery()+ const { isLoading, isError, isFetching, error, data: posts } = useQuery()<div style={{ display: 'flex', gap: '8px' }}>-  <button disabled={isLoading} notallow={() => setPage(prePage => Math.max(0, prePage - 1))}>Previous Page</button>-  <button disabled={isLoading} notallow={() => setPage(prePage => prePage + 1)}>Next Page</button>+  <button disabled={isLoading || isFetching} notallow={() => setPage(prePage => Math.max(0, prePage - 1))}>Previous Page</button>+  <button disabled={isLoading || isFetching} notallow={() => setPage(prePage => prePage + 1)}>Next Page</button></div>

再次查看效果:6Yl28资讯网——每日最新资讯28at.com

图片图片6Yl28资讯网——每日最新资讯28at.com

不过,除了 isFetching,useQuery() 还返回了一个 isPreviousData 状态,让你判断当前展示的是不是旧数据。6Yl28资讯网——每日最新资讯28at.com

- const { isLoading, isError, isFetching, error, data: posts } = useQuery()+ const { isLoading, isError, isPreviousData, isFetching, error, data: posts } = useQuery()- <ul>+ <ul style={{ opacity: isPreviousData ? 0.5 : 1 }}>  {    posts?.data.map(post => (      <li key={post.id}>{post.title}</li>    ))  }</ul>

再次查看效果:6Yl28资讯网——每日最新资讯28at.com

图片图片6Yl28资讯网——每日最新资讯28at.com

这样旧数据在展示期间,加了一点点透明效果。6Yl28资讯网——每日最新资讯28at.com

至此,我们就讲完了 useQuery() 的分页优化能力。6Yl28资讯网——每日最新资讯28at.com

总结

本文我讲解了另一个 useQuery() 能力——keepPreviousData。6Yl28资讯网——每日最新资讯28at.com

在设置 keepPreviousData: true 后,我们在进行分页查询时,同时能保持旧数据的展示,避免页面闪动。6Yl28资讯网——每日最新资讯28at.com

本质上,keepPreviousData 选项是 useQuery() 针对分页场景上的一个优化能力。6Yl28资讯网——每日最新资讯28at.com

当然,UI 交互中还有一种特殊的分页场景,即无限查询(Infinite Query)。这在“上滑/上拉查看历史数据”,或者“下滑/下拉查看最新数据”被广泛采用,不过 useQuery 是解决不了的了,这要靠 useInfiniteQuery()。6Yl28资讯网——每日最新资讯28at.com

参考资料

[1]React Query 是做什么的?: https://juejin.cn/post/73780152133482578556Yl28资讯网——每日最新资讯28at.com

[2]一个数据获竟然被 React Query 玩出这么多花样来!: https://juejin.cn/post/73803421605819187316Yl28资讯网——每日最新资讯28at.com

[3]useQuery() 在分页上的优化能力: https://tanstack.com/query/v3/docs/framework/react/guides/paginated-queries6Yl28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-96988-0.htmlReact Query 的 useQuery 竟也内置了分页查询支持!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 用 foreach 风格遍历的八个高效 Python 技巧

下一篇: vivo 互联网自研代码评审 VCR 落地实践

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的&ldquo;在线鉴别&rdquo;,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 四年持续更迭坚持探索行业无人之境,HarmonyOS 4带来五大升级多项创新

    除了华为每年新发布的旗舰手机系列,上亿花粉更加期待鸿蒙系统每次的跨版本大更新。8月4日,HarmonyOS 4于HDC 2023正式发布,这也是该系统历经四年的再
Top