日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何使用 React Query 做下拉數據自動刷新?

來源: 責編: 時間:2024-07-02 17:37:24 216觀看
導讀useInfiniteQuery() API看名字就能猜出來,useInfiniteQuery() 是專門用來應付無限查詢場景的。不僅如此,useInfiniteQuery() API 能力也是基于 useQuery() 的。之前的文章中我們介紹了 useQuery() 的核心 API,為了找回印

useInfiniteQuery() API

看名字就能猜出來,useInfiniteQuery() 是專門用來應付無限查詢場景的。不僅如此,useInfiniteQuery() API 能力也是基于 useQuery() 的。WiB28資訊網——每日最新資訊28at.com

之前的文章中我們介紹了 useQuery() 的核心 API,為了找回印象,我們在此貼出來:WiB28資訊網——每日最新資訊28at.com

import { useQuery } from 'react-query'const {  data,  error,  isError,  isFetching,  isLoading,  isRefetching,  isSuccess,  refetch,} = useQuery(queryKey, queryFn?, {  enabled,  onError,  onSuccess,  refetchOnWindowFocus,  retry,  staleTime,})

如果我們把這些 API 簡化如下:WiB28資訊網——每日最新資訊28at.com

const {  ...result,} = useQuery(queryKey, queryFn?, {  ...options,})

useInfiniteQuery() 其實就是在 useQuery() 基礎之上增添一些無限查詢場景的參數:WiB28資訊網——每日最新資訊28at.com

const {  fetchNextPage,  fetchPreviousPage,  hasNextPage,  hasPreviousPage,  isFetchingNextPage,  isFetchingPreviousPage,  ...result} = useInfiniteQuery(queryKey, ({ pageParam = 1 }) => fetchPage(pageParam), {  ...options,  getNextPageParam: (lastPage, allPages) => lastPage.nextCursor,  getPreviousPageParam: (firstPage, allPages) => firstPage.prevCursor,})

如你所見,增加的 API 其實就是跟上一頁/下一頁查詢動作相關的參數,相比較于自己組裝 的分頁查詢能力的 useQuery(),useInfiniteQuery() 需要配置上一頁/下一頁的參數獲取函數,并提供了相應的查詢調用能力,更加自動化和便捷。WiB28資訊網——每日最新資訊28at.com

當然,增加的不只是參數,還有 2 處:WiB28資訊網——每日最新資訊28at.com

一個是 queryFn 參數的入參,多了一個名為 pageParam 的參數。WiB28資訊網——每日最新資訊28at.com

pageParam 表示當前頁數。這個值是每次 useInfiniteQuery() 調用時,通過 getNextPageParam()/getPreviousPageParam() 返回值自動獲取并傳入 queryFn 的。WiB28資訊網——每日最新資訊28at.com

第二個還有返回值的數據結構,即 data。WiB28資訊網——每日最新資訊28at.com

const { data } = useInfiniteQuery()

原來 data 就是表示內部請求方法的返回值。而 useInfiniteQuery() 的返回 data 因為要包含多頁數據(展示舊數據時,還要持有舊數據),因此 data 變更為:WiB28資訊網——每日最新資訊28at.com

data: { pages: TData[], pageParams: unknown[] }

pages 很好理解,就是用來承載過程中請求到的多頁數據;pageParams 則是每個頁面當時在做數據獲取時使用的查詢參數。WiB28資訊網——每日最新資訊28at.com

簡單一例

當然語言上說得再多,也是蒼白無力的,實踐出真知。這里我們就舉一個簡單的例子說明 useInfiniteQuery() 的使用。WiB28資訊網——每日最新資訊28at.com

首先,我們先創(chuàng)建一個獲取數據的請求函數(使用 Fetch API)。WiB28資訊網——每日最新資訊28at.com

const getPosts = async (pageParam) => {  return fetch(`https://jsonplaceholder.typicode.com/posts?_page=${pageParam.page}&_limit=${pageParam.size}`).then(res => res.json())}

接著,使用 useInfiniteQuery() 請求數據:WiB28資訊網——每日最新資訊28at.com

function Example() {  const {    isLoading,    isError,    error,    data,  } = useInfiniteQuery(    'posts',    ({ pageParam }) => getPosts(pageParam),    {      getNextPageParam: (lastPage, allPages) => ({ page: allPages.length + 1, size: 6 }),      refetchOnWindowFocus: false, // Prevent refetching on window focus    }  )    // ...}

增加下加載中或出現異常時的處理邏輯。WiB28資訊網——每日最新資訊28at.com

function Example() {  // ...  if (isLoading) {    return <div>Loading...</div>;  }  if (isError) {    return <div>Error: {error.message}</div>  }    // ...}

最后渲染分頁數據。WiB28資訊網——每日最新資訊28at.com

function Example() {  // ...  return (    <div>      <ol>        {/* (1) */}        {data.pages.map((page) => (          {page.map((post) => (            <li key={post.id}>{post.title}</li>          ))}        ))}      </ol>            {/* (2) */}      <button onClick={() => fetchNextPage()}>More</button>    </div>  )}
  1. 遍歷 data.pages 中所有頁面數據,渲染出來
  2. 使用 fetchNextPage() 函數加載更多(實際上即“下一頁”)數據

瀏覽器訪問,不幸運是,報錯了。WiB28資訊網——每日最新資訊28at.com

圖片圖片WiB28資訊網——每日最新資訊28at.com

完美。WiB28資訊網——每日最新資訊28at.com

最后,再把完整代碼貼出來,方便大家學習。WiB28資訊網——每日最新資訊28at.com

import { useEffect, useRef } from 'react'import { QueryClient, QueryClientProvider, useInfiniteQuery } from 'react-query'// Create a clientconst queryClient = new QueryClient()export default function App() {  return (    // Provide the client to your App    <QueryClientProvider client={queryClient}>      <Example />    </QueryClientProvider>  )}const getPosts = async (pageParam = { page: 1, size: 25 }) => {  return fetch(`https://jsonplaceholder.typicode.com/posts?_page=${pageParam.page}&_limit=${pageParam.size}`).then(res => {    const total = res.headers.get('X-Total-Count')    return res.json().then(data => {      return {        total,        data,        hasMore: pageParam.page * pageParam.size < total      }    })  })}function Example() {  const {    isLoading,    isFetchingNextPage,    hasNextPage,    isError,    error,    data,    fetchNextPage  } = useInfiniteQuery(    'posts',    ({ pageParam }) => getPosts(pageParam),    {      getNextPageParam: (lastPage, allPages) => {        return lastPage.hasMore ? { page: allPages.length + 1, size: 25 } : undefined      },      refetchOnWindowFocus: false, // Prevent refetching on window focus    }  )  const loadMoreRef = useRef(null);  useEffect(() => {    const observer = new IntersectionObserver((entries) => {      if (entries[0].isIntersecting && hasNextPage) {        fetchNextPage();      }    });    if (loadMoreRef.current) {      observer.observe(loadMoreRef.current);    }    return () => observer.disconnect();  }, [hasNextPage, fetchNextPage]);  if (isLoading) {    return <div>Loading...</div>;  }  if (isError) {    return <div>Error: {error.message}</div>  }  return (    <div>      <p>總共 <strong>{data.pages[0].total}</strong> 條數據</p>      <ol>        {data.pages.map((page) => (          <>            {page.data.map((post) => (              <li key={post.id}>{post.title}</li>            ))}          </>        ))}      </ol>      <div className="loadMore" style={{ height: '30px', lineHeight: '30px' }} ref={loadMoreRef}>        {          isFetchingNextPage ? <span>Loading...</span> : <span>--- 我是有底線的 ---</span>        }      </div>    </div>  )}

總結

本文我們講述了 React Query 中用于無限查詢 API useInfiniteQuery() 的使用。WiB28資訊網——每日最新資訊28at.com

通過循序漸進的 3 個案例,最終實現了一個下拉到底后自動新數據的交互效果,還是比較好實現的。WiB28資訊網——每日最新資訊28at.com

當然,本文只是以“下一頁”舉例,“上一頁”與此同理。WiB28資訊網——每日最新資訊28at.com

希望本位講述的內容能夠對你的工作有所幫助。感謝閱讀,再見。WiB28資訊網——每日最新資訊28at.com

參考資料

[1]React Query 是做什么的?: https://juejin.cn/post/7378015213348257855WiB28資訊網——每日最新資訊28at.com

[2]一個數據獲竟然被 React Query 玩出這么多花樣來!: https://juejin.cn/post/7380342160581918731WiB28資訊網——每日最新資訊28at.com

[3]React Query 的 useQuery 竟也內置了分頁查詢支持!: https://juejin.cn/post/7380569775686746151WiB28資訊網——每日最新資訊28at.com

[4]IntersectionObserver API: https://ruanyifeng.com/blog/2016/11/intersectionobserver_api.htmlWiB28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-98195-0.html如何使用 React Query 做下拉數據自動刷新?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 聊聊大文件分片上傳和分片下載

下一篇: 智能個性化推薦系統(tǒng)設計與實踐,你學會了嗎?

標簽:
  • 熱門焦點
  • 一加Ace2 Pro真機揭曉 鈦空灰配色質感拉滿

    終于,在經過了幾波預熱之后,一加Ace2 Pro的外觀真機圖在網上出現了。還是博主數碼閑聊站曝光的,這次的外觀設計還是延續(xù)了一加11的方案,只是細節(jié)上有了調整,例如新加入了鈦空灰
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現已正式出爐,冠軍是來自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 騰訊蓋樓,字節(jié)拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 自律,給不了Keep自由!

    來源 | 互聯(lián)網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 疑似小米14外觀設計圖曝光:后置相機模組變化不大

    下半年的大幕已經開啟,而誰將成為下半年手機圈的主角就成為了大家關注的焦點,其中被傳有望拿下新一代驍龍8 Gen3旗艦芯片的小米14系列更是備受大家矚
  • 蘋果公司要求三星和LG Display生產「無邊框」OLED iPhone顯示屏

    據 The Elec 報道,蘋果已要求其供應商為未來的 iPhone 型號開發(fā)「無邊框」OLED 顯示面板。蘋果顯然已要求三星和 LG Display 開發(fā)新的 OLED 顯示面
  • iQOO Neo8系列今日官宣:首發(fā)天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯(lián)發(fā)科新一代旗艦芯片天璣9200+的發(fā)布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發(fā)搭載這款當前性能最強大的移動平臺
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲欧美日韩精品| 伊人成年综合电影网| 欧美国产丝袜视频| 欧美激情视频网站| 国产精品久久99| 国产日韩欧美在线播放| 亚洲二区精品| 亚洲另类自拍| 亚洲一区网站| 久久久噜噜噜久噜久久| 欧美国产综合视频| 国产精品视频第一区| 国外精品视频| 99亚洲视频| 久久精品国产99国产精品澳门| 免费亚洲视频| 国产精品久久久久免费a∨大胸| 国产在线视频欧美一区二区三区| 亚洲人体偷拍| 欧美伊人影院| 欧美日韩视频不卡| 狠狠色综合播放一区二区| 99这里有精品| 久久午夜精品| 国产精品毛片一区二区三区 | 欧美午夜宅男影院| 激情成人综合网| 一区二区三区导航| 老司机免费视频一区二区三区| 国产精品分类| 亚洲福利视频网| 欧美一区二区三区播放老司机| 欧美极品在线观看| 狠狠综合久久av一区二区老牛| 亚洲无吗在线| 欧美激情在线狂野欧美精品| 国产一区二区日韩精品欧美精品| 一区二区激情小说| 男人插女人欧美| 国产一区成人| 亚洲免费伊人电影在线观看av| 欧美激情日韩| 亚洲第一精品夜夜躁人人爽| 亚洲欧美中文日韩v在线观看| 欧美精品电影| 亚洲国产成人tv| 久久九九99| 国产精品午夜在线观看| 99亚洲视频| 欧美国产一区在线| 在线日本高清免费不卡| 欧美一区亚洲一区| 国产精品久久久久久影院8一贰佰| 亚洲国产精品久久久久婷婷老年| 久久精品一区二区三区中文字幕 | 国产亚洲精品久| 亚洲性夜色噜噜噜7777| 欧美另类人妖| 亚洲三级免费电影| 欧美插天视频在线播放| 激情成人在线视频| 久久成人精品电影| 国产欧美另类| 羞羞漫画18久久大片| 国产精品v欧美精品v日韩| 99精品国产99久久久久久福利| 猛干欧美女孩| 影音先锋日韩资源| 久久久www成人免费毛片麻豆| 国产日产精品一区二区三区四区的观看方式| 在线视频欧美精品| 欧美色视频在线| 一区二区日韩免费看| 欧美美女视频| 日韩一级网站| 欧美日韩在线一区| 一区二区三区国产精品| 欧美三级在线| 亚洲伊人一本大道中文字幕| 国产精品久久久久久久电影 | 99热免费精品| 欧美日韩免费观看一区| 99在线精品视频| 欧美日韩在线播放三区四区| 一区二区黄色| 国产精品久久久久久模特| 午夜国产精品视频免费体验区| 国产精品爽爽ⅴa在线观看| 午夜精品久久久久久99热软件| 国产精品羞羞答答| 欧美在线观看网站| 国语精品中文字幕| 久久亚洲春色中文字幕久久久| 在线看日韩欧美| 欧美福利影院| 一区二区三区视频观看| 国产精品久久久久久久电影| 亚洲欧美日韩在线高清直播| 国产午夜精品全部视频播放| 久久视频国产精品免费视频在线| 亚洲福利视频在线| 欧美日韩不卡一区| 亚洲欧美激情诱惑| 韩国一区二区三区在线观看| 免费看成人av| 一本色道久久88综合日韩精品| 国产精品乱人伦中文| 久久久美女艺术照精彩视频福利播放| 亚洲福利视频网站| 欧美日韩另类一区| 性久久久久久| 亚洲国产日韩欧美在线99 | 欧美日韩在线不卡一区| 午夜欧美大片免费观看| 国内精品嫩模av私拍在线观看 | 欧美美女福利视频| 午夜日韩在线| 亚洲第一主播视频| 欧美丝袜第一区| 久久九九热re6这里有精品| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美日本精品一区二区三区| 亚洲自拍电影| 亚洲第一狼人社区| 国产精品xnxxcom| 久久网站免费| 亚洲深爱激情| 一区在线视频| 国产精品扒开腿爽爽爽视频| 久久欧美肥婆一二区| 一区二区成人精品| 国产一区清纯| 欧美日本免费一区二区三区| 欧美一级网站| 亚洲每日更新| 国产一区二区三区自拍| 欧美精品日韩www.p站| 欧美一区二区视频网站| 亚洲日本欧美天堂| 国产亚洲第一区| 欧美日韩麻豆| 美女主播视频一区| 亚洲一区影音先锋| 亚洲国产裸拍裸体视频在线观看乱了中文 | 99日韩精品| 国产一区三区三区| 欧美日韩一区高清| 久久久五月天| 亚洲综合视频在线| 亚洲日本在线视频观看| 国产一区二区三区电影在线观看 | 欧美视频在线不卡| 久久综合色播五月| 香蕉久久夜色精品国产| 日韩亚洲欧美中文三级| 精品不卡在线| 国产欧美日韩视频| 欧美日韩一区自拍| 欧美韩日精品| 久久在线视频在线| 欧美一区二区视频在线观看2020| 一本一本久久a久久精品牛牛影视| 在线观看日韩| 国产区亚洲区欧美区| 欧美日韩在线看| 欧美成人国产一区二区| 久久精品导航| 午夜久久久久久久久久一区二区| 亚洲久久视频| 亚洲第一级黄色片| 国产一区二区三区丝袜| 国产精品久久久久毛片软件| 欧美久久久久久久| 免费高清在线视频一区·| 午夜一区二区三区在线观看| 99国产精品视频免费观看一公开 | 国产精品99久久不卡二区| 亚洲电影在线免费观看| 国产亚洲一级| 国产精品一级久久久| 欧美色精品在线视频| 欧美久久久久免费| 麻豆九一精品爱看视频在线观看免费 | 欧美制服第一页| 亚洲自拍另类| 亚洲婷婷免费| 一区二区三区 在线观看视频| 亚洲精品久久久久久久久久久久久 | 91久久精品一区| 亚洲二区视频| 亚洲福利视频网站| 亚洲第一精品影视| 亚洲国产成人在线| 亚洲国产成人一区| 在线观看不卡av| 亚洲成色最大综合在线| 亚洲第一福利社区| 在线视频国产日韩| 亚洲国产精品电影| 亚洲人体1000| 一本色道久久加勒比88综合 | 欧美福利在线| 欧美激情视频一区二区三区免费| 欧美大片在线观看|