React Query(现在称为 TanStack Query)是一个非常流行的 React 应用程序数据获取和状态管理库。它通过处理数据获取、缓存、同步和分页的复杂性来简化远程数据的处理。 React Query 抽象了发出 API 请求、存储和更新数据以及管理加载状态所涉及的大部分手动过程。
TanStack Query 帮助开发人员以最少的设置管理 React 应用程序中的服务器状态,确保流畅的用户体验,尤其是在处理异步操作时。
React Query 是一个数据获取和状态管理工具,有助于简化React应用程序中与服务器端数据交互的过程。它抽象并管理数据的获取、缓存、同步和后台更新。
它主要用于管理服务器状态,它指的是来自远程服务器或API的数据,例如来自REST API、GraphQL或任何其他数据源的数据。
主要特点:
React Query 中的查询用于从服务器(或任何外部数据源)获取数据。查询由唯一键标识,React Query 使用该键来缓存和跟踪数据。
import { useQuery } from 'react-query'; function fetchPosts() { return fetch('https://jsonplaceholder.typicode.com/posts') .then((response) => response.json()); } const Posts = () => { const { data, error, isLoading } = useQuery('posts', fetchPosts); if (isLoading) return <div>Loading...</div>; if (error) return <div>Error fetching posts</div>; return ( <ul> {data.map((post) => ( <li key={post.id}>{post.title}</li> ))} </ul> ); };
突变用于修改或创建服务器上的数据(例如,POST、PUT、DELETE 请求)。与查询一样,可以跟踪突变并在成功突变后自动更新您的状态。
import { useMutation } from 'react-query'; function createPost(postData) { return fetch('https://jsonplaceholder.typicode.com/posts', { method: 'POST', body: JSON.stringify(postData), headers: { 'Content-Type': 'application/json' }, }).then((response) => response.json()); } const NewPost = () => { const mutation = useMutation(createPost); const handleCreatePost = async () => { await mutation.mutate({ title: 'New Post', body: 'This is a new post' }); }; return ( <div> <button onClick={handleCreatePost}>Create Post</button> {mutation.isLoading ? <p>Creating post...</p> : null} {mutation.isError ? <p>Error creating post</p> : null} {mutation.isSuccess ? <p>Post created!</p> : null} </div> ); };
React Query 自动缓存查询结果。这种缓存可以实现更快的渲染,并避免向服务器发出重复的请求。重新获取查询时,缓存数据会自动更新。
您可以自定义缓存行为以满足应用程序的需求,例如设置缓存时间或指定过时时间(缓存数据被视为过时的时间)。
const { data } = useQuery('posts', fetchPosts, { staleTime: 1000 * 60 * 5, // Cache is fresh for 5 minutes cacheTime: 1000 * 60 * 30, // Cache persists for 30 minutes });
React Query 提供内置的分页支持。您可以使用自定义页面和限制参数来获取分页数据,并且它将适当地缓存响应。
const fetchPage = (page) => fetch(`https://jsonplaceholder.typicode.com/posts?_page=${page}&_limit=10`) .then((res) => res.json()); const PaginatedPosts = () => { const [page, setPage] = React.useState(1); const { data, isLoading, isError } = useQuery(['posts', page], () => fetchPage(page)); if (isLoading) return <div>Loading...</div>; if (isError) return <div>Error</div>; return ( <div> <ul> {data.map((post) => ( <li key={post.id}>{post.title}</li> ))} </ul> <button onClick={() => setPage((prev) => prev - 1)} disabled={page === 1}> Previous </button> <button onClick={() => setPage((prev) => prev + 1)}>Next</button> </div> ); };
要使用React Query,您需要安装react-query (TanStack Query):
npm install react-query
要在应用程序中启用 React Query,您需要将根组件包装在 QueryClientProvider 中,以为整个应用程序提供必要的上下文。
import { QueryClient, QueryClientProvider } from 'react-query'; const queryClient = new QueryClient(); const App = () => ( <QueryClientProvider client={queryClient}> <YourApp /> </QueryClientProvider> );
React Query 通过 useInfiniteQuery 支持分页和无限滚动,允许您处理无限列表和分页。
import { useInfiniteQuery } from 'react-query'; function fetchPostsPage({ pageParam = 1 }) { return fetch(`https://jsonplaceholder.typicode.com/posts?_page=${pageParam}`) .then((res) => res.json()); } const InfinitePosts = () => { const { data, fetchNextPage, hasNextPage, isLoading, isFetchingNextPage, } = useInfiniteQuery('posts', fetchPostsPage, { getNextPageParam: (lastPage, allPages) => lastPage.length === 10 ? allPages.length + 1 : false, }); return ( <div> {isLoading ? <div>Loading...</div> : null} {data?.pages.map((page, i) => ( <div key={i}> {page.map((post) => ( <p key={post.id}>{post.title}</p> ))} </div> ))} <button onClick={() => fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage}> {isFetchingNextPage ? 'Loading more...' : hasNextPage ? 'Load More' : 'No more posts'} </button> </div> ); };
您可以使用 queryClient.invalidateQueries 手动使查询无效。这会强制重新获取指定查询键的数据。
import { useQuery } from 'react-query'; function fetchPosts() { return fetch('https://jsonplaceholder.typicode.com/posts') .then((response) => response.json()); } const Posts = () => { const { data, error, isLoading } = useQuery('posts', fetchPosts); if (isLoading) return <div>Loading...</div>; if (error) return <div>Error fetching posts</div>; return ( <ul> {data.map((post) => ( <li key={post.id}>{post.title}</li> ))} </ul> ); };
React Query 减少了处理加载、成功和错误状态的样板文件,使数据获取更容易且更具声明性。
默认情况下会缓存获取的数据,减少不必要的网络请求并加快您的应用程序的速度。
React Query 提供后台数据获取,确保您的应用程序的数据即使在未显式重新获取时也保持最新。
使用 React Query 的内置钩子处理分页和无限滚动既简单又高效。
React Query 提供了一个优秀的 DevTools 界面,用于实时检查查询、突变及其状态。
**
React Query (TanStack Query) 提供了一种高效且可扩展的方式来处理 React 应用程序中的数据获取和状态管理。借助内置缓存、后台获取、分页和错误处理,React Query 使与服务器端数据的交互变得简单、无缝。
以上是React Query(TanStack Query):React 的高效数据获取和状态管理的详细内容。更多信息请关注PHP中文网其他相关文章!