React Query 入门:轻松管理数据请求
React Query 入门指南:简化 React 应用中的数据获取
React Query 的核心优势
React Query 是一个专为 React 应用设计的数据管理库,专注于简化数据获取、缓存和状态同步。它通过内置的缓存机制和自动后台刷新,显著减少冗余代码和手动状态管理。
React Query 的核心优势包括:
- 自动缓存:数据请求结果自动缓存,避免重复请求。
- 后台数据同步:自动在应用焦点变化或网络重连时更新数据。
- 开发者工具:内置 DevTools,方便调试查询和缓存状态。
安装与基础配置
通过 npm 或 yarn 安装 React Query:
npm install @tanstack/react-query
在应用中配置 QueryClient 和 QueryClientProvider:
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const queryClient = new QueryClient();
function App() {
return (
<QueryClientProvider client={queryClient}>
<YourComponent />
</QueryClientProvider>
);
}
基本数据查询
使用 useQuery 钩子发起数据请求。以下示例从 API 获取用户数据:
import { useQuery } from '@tanstack/react-query';
function UserList() {
const { data, isLoading, error } = useQuery({
queryKey: ['users'],
queryFn: () => fetch('/api/users').then(res => res.json()),
});
if (isLoading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<ul>
{data.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}
- queryKey:唯一标识查询的键,用于缓存管理。
- queryFn:返回 Promise 的函数,用于实际数据请求。
数据修改与乐观更新
通过 useMutation 处理数据修改(如 POST、PUT 请求),并支持乐观更新:
import { useMutation, useQueryClient } from '@tanstack/react-query';
function AddUser() {
const queryClient = useQueryClient();
const mutation = useMutation({
mutationFn: (newUser) => fetch('/api/users', {
method: 'POST',
body: JSON.stringify(newUser),
}),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['users'] });
},
});
const handleSubmit = () => {
mutation.mutate({ name: 'New User' });
};
return <button onClick={handleSubmit}>Add User</button>;
}
- invalidateQueries:使缓存失效,触发重新获取数据。
高级功能与优化
- 分页查询:通过
useInfiniteQuery实现无限滚动或分页加载。 - 预加载数据:使用
prefetchQuery提前加载用户可能访问的数据。 - 依赖查询:通过
enabled选项控制查询的触发条件。
总结
React Query 通过抽象化数据管理的复杂性,让开发者更专注于业务逻辑。其核心功能如自动缓存、后台同步和开发者工具,使其成为现代 React 应用的理想选择。
BbS.okapop113.sbs/PoSt/1122_994967.HtM
BbS.okapop114.sbs/PoSt/1122_331640.HtM
BbS.okapop115.sbs/PoSt/1122_274916.HtM
BbS.okapop116.sbs/PoSt/1122_529074.HtM
BbS.okapop117.sbs/PoSt/1122_017927.HtM
BbS.okapop118.sbs/PoSt/1122_991004.HtM
BbS.okapop119.sbs/PoSt/1122_294343.HtM
BbS.okapop120.sbs/PoSt/1122_743661.HtM
BbS.okapop121.sbs/PoSt/1122_649144.HtM
BbS.okapop122.sbs/PoSt/1122_919419.HtM
BbS.okapop113.sbs/PoSt/1122_723181.HtM
BbS.okapop114.sbs/PoSt/1122_888666.HtM
BbS.okapop115.sbs/PoSt/1122_025681.HtM
BbS.okapop116.sbs/PoSt/1122_397965.HtM
BbS.okapop117.sbs/PoSt/1122_929881.HtM
BbS.okapop118.sbs/PoSt/1122_492653.HtM
BbS.okapop119.sbs/PoSt/1122_047571.HtM
BbS.okapop120.sbs/PoSt/1122_685054.HtM
BbS.okapop121.sbs/PoSt/1122_538545.HtM
BbS.okapop122.sbs/PoSt/1122_388113.HtM
BbS.okapop113.sbs/PoSt/1122_432572.HtM
BbS.okapop114.sbs/PoSt/1122_910931.HtM
BbS.okapop115.sbs/PoSt/1122_719314.HtM
BbS.okapop116.sbs/PoSt/1122_686595.HtM
BbS.okapop117.sbs/PoSt/1122_307006.HtM
BbS.okapop118.sbs/PoSt/1122_425989.HtM
BbS.okapop119.sbs/PoSt/1122_133881.HtM
BbS.okapop120.sbs/PoSt/1122_332225.HtM
BbS.okapop121.sbs/PoSt/1122_592062.HtM
BbS.okapop122.sbs/PoSt/1122_532701.HtM
BbS.okapop113.sbs/PoSt/1122_009536.HtM
BbS.okapop114.sbs/PoSt/1122_656241.HtM
BbS.okapop115.sbs/PoSt/1122_436793.HtM
BbS.okapop116.sbs/PoSt/1122_104044.HtM
BbS.okapop117.sbs/PoSt/1122_167534.HtM
BbS.okapop118.sbs/PoSt/1122_284604.HtM
BbS.okapop119.sbs/PoSt/1122_915900.HtM
BbS.okapop120.sbs/PoSt/1122_163722.HtM
BbS.okapop121.sbs/PoSt/1122_698225.HtM
BbS.okapop122.sbs/PoSt/1122_047411.HtM
BbS.okapop113.sbs/PoSt/1122_626107.HtM
BbS.okapop114.sbs/PoSt/1122_229903.HtM
BbS.okapop115.sbs/PoSt/1122_487450.HtM
BbS.okapop116.sbs/PoSt/1122_129163.HtM
BbS.okapop117.sbs/PoSt/1122_794672.HtM
BbS.okapop118.sbs/PoSt/1122_229686.HtM
BbS.okapop119.sbs/PoSt/1122_436097.HtM
BbS.okapop120.sbs/PoSt/1122_910533.HtM
BbS.okapop121.sbs/PoSt/1122_360860.HtM
BbS.okapop122.sbs/PoSt/1122_028188.HtM
BbS.okapop113.sbs/PoSt/1122_052825.HtM
BbS.okapop114.sbs/PoSt/1122_073566.HtM
BbS.okapop115.sbs/PoSt/1122_883008.HtM
BbS.okapop116.sbs/PoSt/1122_501082.HtM
BbS.okapop117.sbs/PoSt/1122_458758.HtM
BbS.okapop118.sbs/PoSt/1122_332360.HtM
BbS.okapop119.sbs/PoSt/1122_828499.HtM
BbS.okapop120.sbs/PoSt/1122_276348.HtM
BbS.okapop121.sbs/PoSt/1122_395514.HtM
BbS.okapop122.sbs/PoSt/1122_230556.HtM
BbS.okapop113.sbs/PoSt/1122_437590.HtM
BbS.okapop114.sbs/PoSt/1122_584791.HtM
BbS.okapop115.sbs/PoSt/1122_497378.HtM
BbS.okapop116.sbs/PoSt/1122_922163.HtM
BbS.okapop117.sbs/PoSt/1122_819548.HtM
BbS.okapop118.sbs/PoSt/1122_098323.HtM
BbS.okapop119.sbs/PoSt/1122_181367.HtM
BbS.okapop120.sbs/PoSt/1122_361602.HtM
BbS.okapop121.sbs/PoSt/1122_407710.HtM
BbS.okapop122.sbs/PoSt/1122_954251.HtM
BbS.okapop113.sbs/PoSt/1122_413677.HtM
BbS.okapop114.sbs/PoSt/1122_900677.HtM
BbS.okapop115.sbs/PoSt/1122_205451.HtM
BbS.okapop116.sbs/PoSt/1122_464481.HtM
BbS.okapop117.sbs/PoSt/1122_244856.HtM
BbS.okapop118.sbs/PoSt/1122_458853.HtM
BbS.okapop119.sbs/PoSt/1122_515884.HtM
BbS.okapop120.sbs/PoSt/1122_475703.HtM
BbS.okapop121.sbs/PoSt/1122_884375.HtM
BbS.okapop122.sbs/PoSt/1122_725239.HtM