精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

React Query 是做什么的?你知道嗎?

開發(fā) 前端
React Query 本質(zhì)上幫你管理接口請求的,管理的內(nèi)容包括響應(yīng)數(shù)據(jù)和請求狀態(tài),可以讓你少些很多樣板代碼。值得注意的是,React Query 本身并不提供接口請求能力,你可以通過 Fetch API 或是 axios 這種三方庫提供。

最近因?yàn)楣ぷ鞯年P(guān)系,開始接觸 React Query[1]。不用不知道,一用真好用!

React Query 是以前的叫法,現(xiàn)在叫 TanStack Query。之所以改名字,是因?yàn)檫@個團(tuán)隊(duì)發(fā)現(xiàn),他們可以把這套方案推廣到除 React 之外的其他框架中去。

圖片圖片

如圖所示,目前(2024.06)最新的 v5 版本已經(jīng)支持包含 React、Vue、Angular 在內(nèi)的 5 大框架了。

那 React Query 到底是做什么的呢?

籠統(tǒng)地說,React Query 是用來管理接口請求的,包括增刪改查所有類型的接口。管理的內(nèi)容包括響應(yīng)數(shù)據(jù)和請求狀態(tài),可以讓你少些很多樣板代碼。

另外,一旦學(xué)會了 React Query 的使用,那么在其他框架中的應(yīng)用也是一樣,上手就快了。

不過 React Query 學(xué)習(xí)成本也高,要徹底熟練 React Query 的使用,就要學(xué)習(xí)很多概念,不過理解這些概念對于我們寫出交互友好的頁面又極其關(guān)鍵。

于是,我便萌生了寫一個 React Query 系列文章的想法。本文就是第一篇,大概談?wù)撍亲鍪裁吹?,如何使用,有什么能力,后面再一篇一個具體話題單獨(dú)討論。

React Query 是從 v3 版本改名字的:

  • v3 以前(包括 v3)包名叫 react-query
  • 從 v4 開始包名改成 @tanstack/react-query 了

新舊版本改動不多[2],因?yàn)槲椰F(xiàn)在用的是舊包,我就那它舉例了。

安裝 React Query

先創(chuàng)建一個 React 項(xiàng)目。

npm create vite@latest react-query-demos -- --template react
cd react-query-demos

安裝 react-query[3] 依賴,啟動項(xiàng)目。

npm install react-query
npm install
npm run dev

接下來刪除 index.css 中的內(nèi)容,再修改 App.jsx,注入 React Query 上下文依賴。

import { QueryClient, QueryClientProvider, useQuery } from 'react-query'

const queryClient = new QueryClient()

export default function App() {
  return (
    <QueryClientProvider client={queryClient}>
      {/* ... */}
    </QueryClientProvider>
  )
}

這一步是必須的,后續(xù) React Query 的接口查詢和修改等 API 能力都有賴于 queryClient。

快速開始

說了那么多,我們直接上一個 React Query 案例直觀感受一下它的使用。

我們創(chuàng)建一個 <Example /> 組件,內(nèi)容如下:

import { useQuery } from 'react-query'

function Example() {
  // 1)
  const { isLoading, isError, error, data } = useQuery('repoData', () =>
    fetch('https://api.github.com/repos/tannerlinsley/react-query').then(res =>
      res.json()
    )
  )
  
  // 2)
  if (isLoading) return 'Loading...'
  if (isError) return 'An error has occurred: ' + error.message
    
  // 3)
  return (
    <div>
      <h1>{data.name}</h1>
      <p>{data.description}</p>
      <strong>?? {data.subscribers_count}</strong>{' '}
      <strong>? {data.stargazers_count}</strong>{' '}
      <strong>?? {data.forks_count}</strong>
    </div>
  )
}

速覽一遍代碼,我們大概就能明白這塊代碼是用來做數(shù)據(jù)請求的。

再在 <App /> 中引入。

export default function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <Example />
    </QueryClientProvider>
  )
}

我這里簡單解釋一下 <Example /> 中的內(nèi)容:

  1. React Query 有暴露出一個 useQuery 這個 React Hook 用來進(jìn)行數(shù)據(jù)查詢
  • 值得注意的是,React Query 本身并不提供數(shù)據(jù)請求能力,useQuery 的第二個參數(shù)中返回使用 Fetch API 請求的 Github 倉庫數(shù)據(jù)(Promise 數(shù)據(jù))
  • useQuery 的第一個參數(shù),則是用來定義請求數(shù)據(jù)的緩存 key,這個 key 在同一個 queryClient 下唯一。這樣在進(jìn)行第二次請求時,會先直接返回先前的緩存數(shù)據(jù),提升用戶體驗(yàn)
  1. useQuery() 返回值非常貼心的為你封裝了請求狀態(tài),常用的有 isLoading、isError
  • isLoading 為 true 表示目前處于請求中

  • isError 表示請求失敗,失敗消息可以通過 error 獲得

  • 當(dāng)然還有一個 isSuccess,不過不太常用。一般在判斷完 isLoading 和 isError 之后,就說明我們已經(jīng)成功獲得了數(shù)據(jù),通過 data 渲染結(jié)果即可

圖片圖片

三個核心概念

React Query 中有 3 個核心的概念[4],分別是:

  1. 查詢(Queries)
  2. 修改(Mutations)
  3. 作廢緩存(Query Invalidation)

對應(yīng) 3 個 API:

  1. useQuery
  2. useMutation
  3. queryClient.invalidateQueries()

上面一節(jié),我們就講解了“查詢”的使用。

以上我們講解了 React Query 所提供的數(shù)據(jù)能力。

接下來,我們再舉一個完成的例子,說明所有 3 個核心概念。

首先,封裝 API 請求,我們把它放在 my-api.js 文件中。

export function getTodos() {
  return fetch('https://jsonplaceholder.typicode.com/users/1/todos')
    .then(response => response.json())
}

export function postTodo(data) {
  return fetch('https://jsonplaceholder.typicode.com/todos', {
    method: 'POST',
    body: JSON.stringify(data),
    headers: {
      'Content-type': 'application/json; charset=UTF-8',
    },
  })
    .then((response) => response.json())
}

借用了 {JSON} Placeholder[5] 的服務(wù),我們封裝了獲取和更新代辦項(xiàng)目的方法:getTodos() 和 postTodo()。

接著,我們寫一個 <Todos> 組件,替換之前的 <Example /> 組件。

import {
  useQuery,
} from 'react-query'

function Todos() {
  // Queries
  const query = useQuery('todos', getTodos)

  if (query.isLoading) return 'Loading...'
  if (query.isError) return 'An error has occurred: ' + query.error.message

  return (
    <div>
      <ul>
        {query.data.map(todo => (
          <li key={todo.id}>{todo.title}</li>
        ))}
      </ul>
    </div>
  )
}

與之前的 <Example> 大同小異,這里渲染的是一個列表。

不過我們還會增加一個添加代辦項(xiàng)的功能。

import {
  useQuery,
  useMutation
} from 'react-query'

function Todos() {
  // Queries
  const query = useQuery('todos', getTodos)
  
  // 1)
  // Mutations
  const mutation = useMutation(postTodo)

  if (query.isLoading) return 'Loading...'
  if (query.isError) return 'An error has occurred: ' + query.error.message

  return (
    <div>
      <ul>
        {query.data.map(todo => (
          <li key={todo.id}>{todo.title}</li>
        ))}
      </ul>
      
     {/* 2) */}
     <button
        disabled={mutation.isLoading}
        onClick={() => {
          mutation.mutate({
            userId: 1,
            title: 'Do Laundry',
            completed: false
          })
        }}
      >
        Add Todo
      </button>
    </div>
  )
}
  1. 首先,引入一個 useMutation() Hook,包裝添加代辦項(xiàng)的接口能力
  2. useMutation() 的返回值 mutation 跟 useQuery() 的返回值 query 一樣,也是一個復(fù)合對象

你可以通過 mutation.mutate() 進(jìn)行實(shí)際操作(本例中就是添加代辦)

也可以通過 mutation.isLoading/isError 等獲得請求狀態(tài)

最后一個功能就是作廢緩存。

function Todos() {
  // 1)
  // Access the client
  const queryClient = useQueryClient()

  // Mutations
  const mutation = useMutation(postTodo, {
    onSuccess: () => {
      // 2)
      // Invalidate and refetch
      queryClient.invalidateQueries('todos')
    },
  })
  
  // ...
}
  1. 這里就要通過 useQueryClient() 引入 queryClient 了。
  2. 作廢緩存的時機(jī)是在添加完代辦后,因?yàn)檫@個時候代辦列表變化了,我們調(diào)用 queryClient.invalidateQueries('todos') 方法,代入的 'todos' 其實(shí)就是查詢代辦項(xiàng)時使用那個緩存 key。

調(diào)用 .invalidateQueries('todos') 就表示通過 GET '/users/1/todos' 拿到的數(shù)據(jù)已經(jīng)過期了,要重新請求。

所以你會看到點(diǎn)擊“Add Todo”按鈕后,控制臺還會多發(fā)出一個 GET '/users/1/todos' 請求

圖片圖片

總結(jié)

React Query 本質(zhì)上幫你管理接口請求的,管理的內(nèi)容包括響應(yīng)數(shù)據(jù)和請求狀態(tài),可以讓你少些很多樣板代碼。

值得注意的是,React Query 本身并不提供接口請求能力,你可以通過 Fetch API 或是 axios 這種三方庫提供。

React Query 中有 3 個核心的概念,分別是:

  1. 查詢(Queries)
  2. 修改(Mutations),和
  3. 作廢緩存(Query Invalidation)

對應(yīng) 3 個 API:

  1. useQuery
  2. useMutation,和
  3. queryClient.invalidateQueries()

文中也都做了簡單案例介紹,不過每個概念背后又有跟多其他內(nèi)容,這就要在后續(xù)的文章中覆蓋了。

感謝你的閱讀,希望對你有所幫助,再見。

參考資料

[1]

React Query: https://tanstack.com/query/v3/docs/framework/react/overview

[2]新舊版本改動不多: https://tanstack.com/query/v4/docs/framework/react/guides/migrating-to-react-query-4

[3]安裝 react-query: https://tanstack.com/query/v3/docs/framework/react/installation

[4]React Query 中有 3 個核心的概念: https://tanstack.com/query/v3/docs/framework/react/quick-start

[5]{JSON} Placeholder: https://jsonplaceholder.typicode.com/

責(zé)任編輯:武曉燕 來源: 寫代碼的寶哥
相關(guān)推薦

2023-12-20 08:23:53

NIO組件非阻塞

2022-11-28 00:04:17

2024-01-15 12:16:37

2024-07-30 08:22:47

API前端網(wǎng)關(guān)

2024-11-08 09:48:38

異步編程I/O密集

2024-03-19 08:01:54

服務(wù)熔斷軟件設(shè)計模式微服務(wù)

2024-02-19 07:44:52

虛擬機(jī)Java平臺

2025-06-16 09:36:18

2024-06-27 10:51:28

生成式AI領(lǐng)域

2023-07-11 00:12:05

2024-08-08 09:15:08

SQL代碼復(fù)制表

2023-01-04 11:39:45

2023-03-06 16:38:30

SQL數(shù)據(jù)庫

2025-07-01 06:27:55

2024-04-30 09:02:48

2024-12-04 08:40:19

2024-06-20 08:06:30

2024-02-19 00:00:00

Docker輕量級容器

2025-01-16 16:41:00

ObjectConditionJDK

2024-10-05 00:00:00

HTTPS性能HTTP/2
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

天堂在线免费av| www久久久久久久| 第四色日韩影片| 成人激情免费电影网址| 午夜精品三级视频福利| 91亚洲免费视频| gogo在线观看| 不卡视频在线看| 欧美一区第一页| 黄色片在线观看免费| 国产人妖一区| 亚洲精品中文在线| 久久久久综合一区二区三区| 国产免费a视频| 久久久久久美女精品 | 96av在线| 久久精品综合网| 国产成人精品一区| 免费在线观看h片| 加勒比色老久久爱综合网| 亚洲已满18点击进入久久| 精品欧美一区二区久久久伦 | 精品999网站| 亚洲欧美日韩国产成人| 手机免费看av网站| 樱花草涩涩www在线播放| 国产精品毛片a∨一区二区三区| 96sao精品视频在线观看| 国产69精品久久久久久久久久| 成人羞羞动漫| 日韩欧美国产小视频| 亚洲人成无码www久久久| 在线免费观看a视频| 91蜜桃视频在线| 91最新在线免费观看| 日韩精品1区2区| 在线精品视频在线观看高清| 亚洲精品日韩在线| 丰满少妇一区二区三区专区| 91av久久| 亚洲精品v日韩精品| 欧美日韩精品中文字幕一区二区| 国产精品乱码久久久| 亚洲欧美日韩专区| 欧美黑人性猛交| 成人黄色免费网址| 久久97精品| 日韩欧美国产综合在线一区二区三区 | 久久午夜夜伦鲁鲁一区二区| 丁香花在线电影小说观看| 国产精品水嫩水嫩| 欧美激情视频一区二区三区| www香蕉视频| 麻豆一区二区三区| 久久免费视频网| 欧美成人777| 欧美日韩有码| 日韩电影中文字幕| 欧洲熟妇的性久久久久久| 成人自拍视频网| 欧美日韩一区二区三区在线免费观看 | 久久久亚洲精品一区二区三区| 国产精品制服诱惑| 在线观看毛片av| 日韩va欧美va亚洲va久久| 欧美亚州一区二区三区| 国产真实乱偷精品视频| 欧美在线不卡| 久久久国产一区二区三区| 青青青视频在线播放| 国产精选一区| 国产亚洲视频在线| 欧美特级黄色录像| 久久99视频| 亚洲成人激情在线观看| 毛茸茸free性熟hd| 林ゆな中文字幕一区二区| 精品国产伦一区二区三区免费| 亚洲av无码久久精品色欲| 国产精品99久久久久久董美香 | 草民电影神马电影一区二区| 在线亚洲高清视频| 国产理论在线播放| 欧美特黄色片| 欧美一区二区在线视频| 天天av天天操| 99这里只有精品视频| 欧美不卡视频一区| www.88av| 国产欧美日韩精品一区二区免费| 在线日韩精品视频| 色哟哟一一国产精品| 日韩成人a**站| 日韩中文有码在线视频| 国产精品国产精品88| 中文字幕午夜精品一区二区三区| 欧美黄色三级网站| www成人在线| 久久久精品日韩| 国产精品一久久香蕉国产线看观看| 一级黄色大片免费| 国产老肥熟一区二区三区| 高清一区二区三区视频| 天堂av电影在线观看| 国产欧美日韩在线| 黄色小视频大全| 两个人看的在线视频www| 日本韩国一区二区| av在线网址导航| 国产成人视屏| 精品亚洲aⅴ在线观看| 免费看91的网站| 欧美 亚欧 日韩视频在线 | 亚洲xxxx3d动漫| 亚洲三级影院| 国产精品久久一区| 丰满少妇被猛烈进入| 91视视频在线直接观看在线看网页在线看 | 欧美区高清在线| 麻豆传媒视频在线观看| 精品久久久在线观看| 国产一二三区av| 高清日韩欧美| 综合久久五月天| 日韩少妇高潮抽搐| 精品一区二区三区免费观看| 精品国产乱码久久久久久蜜柚 | 国产一区二区久久| 久久国产精品精品国产色婷婷| 自拍视频在线网| 亚洲成人资源在线| 亚洲欧美日韩网站| 日韩黄色网络| 久久91亚洲人成电影网站| 中文字幕亚洲精品一区| 国产剧情一区二区| 日韩精品久久久| 18aaaa精品欧美大片h| 717成人午夜免费福利电影| 亚洲国产欧美视频| 欧美区日韩区| 国产美女精彩久久| 黄色大片在线看| 亚洲精品国产一区二区精华液 | 日本一区二区高清不卡| 国内偷自视频区视频综合| 国产乱码一区二区| 91亚洲国产成人精品一区二区三| 免费观看国产视频在线| 国产精品日韩精品在线播放 | 疯狂撞击丝袜人妻| 激情小说亚洲一区| 强开小嫩苞一区二区三区网站| 四虎精品一区二区免费| 色播久久人人爽人人爽人人片视av| 国产91av在线播放| 国产精品系列在线| 欧美日韩精品区别| 综合久久婷婷| 99在线观看| av中文字幕在线观看第一页| 亚洲精品国产精品国自产在线| 真实国产乱子伦对白在线| 国产精品一区二区视频| 国产曰肥老太婆无遮挡| 清纯唯美亚洲经典中文字幕| 91精品国产高清| 视频午夜在线| 欧美写真视频网站| 三级全黄做爰视频| 大桥未久av一区二区三区中文| 精品少妇在线视频| 欧美猛男男男激情videos| 国产精品久久久久免费a∨大胸| 亚洲搞黄视频| 欧美精品视频www在线观看| 九九热这里有精品视频| av爱爱亚洲一区| 欧美一级黄色片视频| 99精品在线免费在线观看| 97久久夜色精品国产九色| 97在线超碰| 国产亚洲一区二区精品| a视频免费在线观看| 亚洲3atv精品一区二区三区| 久久国产精品影院| 加勒比av一区二区| 国产极品尤物在线| 青青草综合网| 鬼打鬼之黄金道士1992林正英| 忘忧草在线日韩www影院| 在线精品视频视频中文字幕| 国内精品久久久久久久久久| 懂色av影视一区二区三区| 日本污视频网站| 成人一区二区三区| 黄色成人免费看| 国自产拍偷拍福利精品免费一| 欧美三级网色| 蜜桃精品一区二区三区| 国产97在线|亚洲| 在线免费观看a视频| 亚洲天堂av在线免费| www香蕉视频| 欧美日韩在线不卡| 国产成人无码精品| 亚洲欧美aⅴ...| 日本精品在线观看视频| 成人国产精品免费观看| 国产欧美一区二| 日韩中文字幕1| 男女啪啪免费视频网站| 久久精品欧美一区| 欧美日韩国产精品一卡| 成人午夜大片| 国产精品啪视频| 亚洲美女炮图| 久久久久久久久久久亚洲| 欧美激情二区| 在线精品高清中文字幕| 头脑特工队2在线播放| 日韩久久精品一区| 国产农村妇女毛片精品| 在线视频一区二区三区| 亚洲欧美综合自拍| 五月天亚洲婷婷| 国产一级中文字幕| 又紧又大又爽精品一区二区| 中文字幕91视频| 国产亚洲成av人在线观看导航| 国产精品探花一区二区在线观看| 国产成人精品免费一区二区| 亚洲乱码国产一区三区| 激情综合久久| 18禁裸男晨勃露j毛免费观看| 91精品国产91久久久久久密臀| 色综合视频二区偷拍在线| 免费成人高清在线视频theav| 国内一区二区在线视频观看| 国产成人精品亚洲线观看| 99精彩视频在线观看免费| 精品国产乱码久久久久久樱花| 91精品国产综合久久久久久久久| 国产成人久久精品麻豆二区| 国产精品普通话| 国产三级一区| 国产综合久久久久| 欧美一级做a| 成人免费视频网址| 香蕉久久久久久| 亚洲xxxxx| 日韩精品视频一区二区三区| a级国产乱理论片在线观看99| 精品中文视频| 国产精品久久久久久久免费大片| 99re8这里有精品热视频免费| 国产精品久久久久久久久久久久冷 | 国产一区在线播放| 精品久久免费| 国产精品一区二区免费| 欧美尿孔扩张虐视频| 蜜桃视频日韩| 国产乱码精品一区二区三区四区| 亚洲精品在线观看免费| 亚洲精品91| 成人免费播放器| 久久av在线| 亚洲国产高清av| 国产经典欧美精品| 欧美在线一级片| 国产情人综合久久777777| 女人裸体性做爰全过| 亚洲欧美色一区| 久久久久久久久久久网| 欧美日韩美女视频| 午夜一区二区三区四区| 3d成人动漫网站| 免费国产羞羞网站视频| 亚洲欧美日韩精品久久亚洲区| 大地资源中文在线观看免费版| 少妇高潮久久久久久潘金莲| av激情在线| 全亚洲最色的网站在线观看| 日韩欧乱色一区二区三区在线| av色综合网| 国产精品日韩精品中文字幕| 中文字幕av日韩精品| 亚洲黄色一区| 日本人69视频| kk眼镜猥琐国模调教系列一区二区 | 热99这里只有精品| 免费人成在线不卡| 黑森林av导航| 欧美国产激情一区二区三区蜜月| 欧美色图一区二区| 色爱区综合激月婷婷| 成 人 免费 黄 色| 伊人久久久久久久久久久久久| 日本理论片午伦夜理片在线观看| 欧美专区第一页| 日韩成人久久| 日韩高清dvd| 亚洲麻豆av| 日韩av影视大全| 国产日韩欧美精品在线| 精品人妻在线播放| 欧美日本在线看| 美女欧美视频在线观看免费 | 欧美性xxx| 超碰97国产在线| 91亚洲国产成人久久精品| 欧美精品99久久| 国产激情视频一区二区三区欧美| 色噜噜日韩精品欧美一区二区| 亚洲国产日韩a在线播放| 亚洲性生活大片| 亚洲丝袜一区在线| 2021中文字幕在线| 99久热re在线精品996热视频 | 色噜噜狠狠狠综合曰曰曰88av| 极品视频在线| 成人资源av| 欧美在线黄色| 日韩在线不卡一区| 国产欧美1区2区3区| 五月天婷婷导航| 亚洲国产欧美在线成人app| 在线午夜影院| 亚洲精品日产aⅴ| 天天av综合| 亚洲综合色在线观看| 国产欧美中文在线| 亚洲图片欧美日韩| 亚洲欧美福利视频| 神马午夜在线视频| 久久亚洲高清| 噜噜爱69成人精品| 播金莲一级淫片aaaaaaa| 午夜视频在线观看一区| 免费观看国产视频| 欧美激情欧美狂野欧美精品| 香蕉免费一区二区三区在线观看| 免费在线观看污污视频| 久久精品国产久精国产爱| 日本黄区免费视频观看| 欧美日韩和欧美的一区二区| 成人精品一区二区三区校园激情 | 中日韩精品视频在线观看| 精品黑人一区二区三区久久 | 日韩高清欧美| 色一情一区二区三区| 国产精品成人午夜| 国产美女三级无套内谢| 欧美情侣性视频| 大奶一区二区三区| 国产黄页在线观看| 26uuu成人网一区二区三区| 国产精品视频免费播放| 亚洲欧美中文日韩v在线观看| 456亚洲精品成人影院| 亚洲欧洲日韩综合二区| 国产在线视频精品一区| 欧美精品videos极品| 精品久久久久久亚洲综合网| heyzo高清在线| 欧美日韩国产高清视频| 久久国产精品露脸对白| 亚洲av无码一区二区三区在线| 日韩免费福利电影在线观看| 国产美女情趣调教h一区二区| 国内视频一区| 日韩经典中文字幕一区| 性欧美疯狂猛交69hd| 日韩免费高清av| 密臀av在线播放| 色综合视频二区偷拍在线| 国产一区激情在线| 日本中文字幕免费观看| 国产亚洲精品91在线| 国产一区 二区| 青青草原成人网| 国产精品欧美久久久久一区二区| japanese国产| 亚洲精品极品| 欧美一级视频精品观看| 黄色的网站在线观看| 不卡视频一区二区三区| 99精品国产一区二区青青牛奶| www.色天使| 欧美一区二区不卡视频| 天堂а√在线最新版中文在线| 亚洲国产激情一区二区三区| 国产成人一区二区精品非洲| 国产精品久久久久久久久久久久久久久久久 | 国产wwwxx| 亚洲国产精品久久不卡毛片| 国产视频福利在线| 国产精品久久久久久久久久久久冷 | 欧美成人精品一区二区| 免费av一区|