TanStack Query(前身為 React Query)常被稱為網頁應用程式中缺失的資料獲取函式庫,但用更技術性的術語來說,它能讓你在網頁應用程式中獲取、快取、同步和更新伺服器狀態 (server state) 變得輕而易舉。
大多數核心網頁框架並未提供一種全面的方式來獲取或更新資料。因此,開發者最終要麼建立封裝了嚴格資料獲取觀點的元框架 (meta-frameworks),要麼發明自己的資料獲取方式。這通常意味著拼湊基於元件的狀態和副作用,或是使用更通用的狀態管理函式庫來儲存並在應用程式中提供非同步資料。
雖然大多數傳統的狀態管理函式庫非常適合處理客戶端狀態 (client state),但它們在處理非同步或伺服器狀態 (server state) 時表現不佳。這是因為伺服器狀態完全不同。首先,伺服器狀態:
一旦你理解了應用程式中伺服器狀態的本質,隨著進展還會出現更多挑戰,例如:
如果這份清單沒有讓你感到不知所措,那可能意味著你已經解決了所有伺服器狀態的問題,值得獲得一個獎項。然而,如果你像大多數人一樣,要麼尚未解決所有或大部分這些挑戰,而我們才剛剛觸及表面!
TanStack Query 無疑是管理伺服器狀態的最佳函式庫之一。它開箱即用,無需配置,並且可以根據你的喜好進行客製化,隨著應用程式的增長而調整。
TanStack Query 讓你能夠克服伺服器狀態的棘手挑戰和障礙,並在它開始控制你之前掌控你的應用程式資料。
從更技術性的角度來看,TanStack Query 可能會:
在下面的範例中,你可以看到 TanStack Query 以最基本和簡單的形式用於獲取 TanStack Query GitHub 專案本身的 GitHub 統計資料:
import {
QueryClient,
QueryClientProvider,
useQuery,
} from '@tanstack/react-query'
const queryClient = new QueryClient()
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<Example />
</QueryClientProvider>
)
}
function Example() {
const { isPending, error, data } = useQuery({
queryKey: ['repoData'],
queryFn: () =>
fetch('https://api.github.com/repos/TanStack/query').then((res) =>
res.json(),
),
})
if (isPending) return 'Loading...'
if (error) return 'An error has occurred: ' + error.message
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>
)
}
import {
QueryClient,
QueryClientProvider,
useQuery,
} from '@tanstack/react-query'
const queryClient = new QueryClient()
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<Example />
</QueryClientProvider>
)
}
function Example() {
const { isPending, error, data } = useQuery({
queryKey: ['repoData'],
queryFn: () =>
fetch('https://api.github.com/repos/TanStack/query').then((res) =>
res.json(),
),
})
if (isPending) return 'Loading...'
if (error) return 'An error has occurred: ' + error.message
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>
)
}