乐闻世界logo
搜索文章和话题

How to manage global states with React Query

5 个月前提问
4 个月前修改
浏览次数69

2个答案

1
2

回答:

React Query 本质上是一个用于数据获取、缓存和同步的库,但它也可以被用于简单的全局状态管理。尽管 React Query 并非专为全局状态管理设计(相比如 Redux、MobX 或 React Context),但它提供的一些功能可以使全局状态的管理变得更简单,特别是当这些状态与数据获取操作相关时。

以下是使用 React Query 管理全局状态的步骤和示例:

1. 安装和设置 React Query

首先,你需要在你的 React 项目中安装 React Query。

bash
npm install react-query

然后,在你的应用的顶层组件中设置 QueryClientQueryClientProvider

javascript
import { QueryClient, QueryClientProvider } from 'react-query'; const queryClient = new QueryClient(); function App() { return ( <QueryClientProvider client={queryClient}> {/* 其他组件 */} </QueryClientProvider> ); }

2. 使用 useQuery 或 useMutation 管理数据

假设你要全局管理用户信息,你可以使用 useQuery 来获取并缓存这些信息:

javascript
import { useQuery } from 'react-query'; function UserInfo() { const { data: user, isLoading } = useQuery('user', fetchUser); if (isLoading) return 'Loading...'; return ( <div> <h1>{user.name}</h1> {/* 显示其他用户信息 */} </div> ); }

在这里,fetchUser 是一个函数,负责从后端 API 获取用户数据。React Query 将自动处理缓存和背景更新。

3. 使用 useMutation 管理更改状态的操作

如果需要执行某些会更改服务器上数据的操作(例如更新用户信息),你可以使用 useMutation

javascript
import { useMutation, useQueryClient } from 'react-query'; function UpdateUserForm({ user }) { const queryClient = useQueryClient(); const { mutate } = useMutation(updateUser, { onSuccess: () => { queryClient.invalidateQueries('user'); }, }); const handleSubmit = (event) => { event.preventDefault(); const formData = new FormData(event.target); const newUser = { id: user.id, name: formData.get('name') }; mutate(newUser); }; return ( <form onSubmit={handleSubmit}> <input name="name" defaultValue={user.name} /> <button type="submit">Update</button> </form> ); }

在这个例子中,updateUser 是一个函数,负责发送更新请求到服务器。useMutationonSuccess 选项用于操作成功后的回调,在这里我们通过调用 queryClient.invalidateQueries('user') 来确保用户信息的查询被更新,从而反映最新的状态。

总结

虽然 React Query 不是传统意义上的全局状态管理工具,但它提供的数据缓存和同步功能使得它可以有效地用于管理与远程数据交互相关的全局状态。此外,通过合理使用 useQueryuseMutation,我们可以实现状态的全局管理和自动更新,从而简化组件间的状态共享和数据一致性维护。

2024年6月29日 12:07 回复

React Query 本质上是一个用于数据获取、缓存和同步的库,但它也可以被用于简单的全局状态管理。尽管 React Query 并非专为全局状态管理设计(相比如 Redux、MobX 或 React Context),但它提供的一些功能可以使全局状态的管理变得更简单,特别是当这些状态与数据获取操作相关时。

以下是使用 React Query 管理全局状态的步骤和示例:

1. 安装和设置 React Query

首先,你需要在你的 React 项目中安装 React Query。

bash
npm install react-query

然后,在你的应用的顶层组件中设置 QueryClientQueryClientProvider

javascript
import { QueryClient, QueryClientProvider } from 'react-query'; const queryClient = new QueryClient(); function App() { return ( <QueryClientProvider client={queryClient}> {/* 其他组件 */} </QueryClientProvider> ); }

2. 使用 useQuery 或 useMutation 管理数据

假设你要全局管理用户信息,你可以使用 useQuery 来获取并缓存这些信息:

javascript
import { useQuery } from 'react-query'; function UserInfo() { const { data: user, isLoading } = useQuery('user', fetchUser); if (isLoading) return 'Loading...'; return ( <div> <h1>{user.name}</h1> {/* 显示其他用户信息 */} </div> ); }

在这里,fetchUser 是一个函数,负责从后端 API 获取用户数据。React Query 将自动处理缓存和背景更新。

3. 使用 useMutation 管理更改状态的操作

如果需要执行某些会更改服务器上数据的操作(例如更新用户信息),你可以使用 useMutation

javascript
import { useMutation, useQueryClient } from 'react-query'; function UpdateUserForm({ user }) { const queryClient = useQueryClient(); const { mutate } = useMutation(updateUser, { onSuccess: () => { queryClient.invalidateQueries('user'); }, }); const handleSubmit = (event) => { event.preventDefault(); const formData = new FormData(event.target); const newUser = { id: user.id, name: formData.get('name') }; mutate(newUser); }; return ( <form onSubmit={handleSubmit}> <input name="name" defaultValue={user.name} /> <button type="submit">Update</button> </form> ); }

在这个例子中,updateUser 是一个函数,负责发送更新请求到服务器。useMutationonSuccess 选项用于操作成功后的回调,在这里我们通过调用 queryClient.invalidateQueries('user') 来确保用户信息的查询被更新,从而反映最新的状态。

总结

虽然 React Query 不是传统意义上的全局状态管理工具,但它提供的数据缓存和同步功能使得它可以有效地用于管理与远程数据交互相关的全局状态。此外,通过合理使用 useQueryuseMutation,我们可以实现状态的全局管理和自动更新,从而简化组件间的状态共享和数据一致性维护。

2024年6月29日 12:07 回复

你的答案