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

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

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

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

基本分页功能实现

项目中通常会遇到分页查询的需要,通过之前的学习,我们会写出这样的代码。WPA28资讯网——每日最新资讯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>  )}

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

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

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

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

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

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

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

保留旧数据的分页功能

我们在之前案例的基础之上,调用 useQuery() 时,指定 keepPreviousData: true 选项。WPA28资讯网——每日最新资讯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  })

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

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

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

不过,这种状态下的中间状态我们还要细致的控制一下,比如请求过程中禁用按钮的点击能力。WPA28资讯网——每日最新资讯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>

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

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

不过,除了 isFetching,useQuery() 还返回了一个 isPreviousData 状态,让你判断当前展示的是不是旧数据。WPA28资讯网——每日最新资讯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>

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

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

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

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

总结

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

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

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

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

参考资料

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top