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

How to add fresh data to an existing data in React- query ?

7 个月前提问
5 个月前修改
浏览次数18

1个答案

1

在React-query中向现有数据添加新数据,通常适用于处理诸如用户提交表单后更新列表这类场景。我们可以通过几个步骤来实现这一功能:

1. 使用useQueryuseMutation

首先,我们需要使用useQuery来获取数据,然后使用useMutation来添加新数据。useMutation不仅可以用来发送数据到服务器,还可以通过其回调来更新本地的缓存数据。

示例代码

假设我们有一个任务列表,我们要向其中添加新任务:

js
import { useQuery, useMutation, useQueryClient } from 'react-query'; function Tasks() { const queryClient = useQueryClient(); const { data: tasks, isLoading } = useQuery('tasks', fetchTasks); const addTaskMutation = useMutation(addTask, { onSuccess: () => { queryClient.invalidateQueries('tasks'); }, }); const handleAddTask = async () => { const newTask = { id: Date.now(), text: 'New Task' }; await addTaskMutation.mutateAsync(newTask); }; if (isLoading) return <div>Loading...</div>; return ( <div> <button onClick={handleAddTask}>Add Task</button> <ul> {tasks.map(task => ( <li key={task.id}>{task.text}</li> ))} </ul> </div> ); }

2. 使用onMutateonSuccess回调来修改缓存

useMutation中,onMutateonSuccess回调可以用来直接修改缓存。这样,即使数据还未从服务器同步回来,用户界面也能即时反馈变化。

  • onMutate: 在数据发送到服务器前,先更新客户端缓存。
  • onSuccess: 在数据成功从服务器返回后,更新客户端缓存。

示例代码 - 使用onMutate

js
const addTaskMutation = useMutation(addTask, { onMutate: async newTask => { await queryClient.cancelQueries('tasks'); const previousTasks = queryClient.getQueryData('tasks'); queryClient.setQueryData('tasks', old => [...old, newTask]); return { previousTasks }; }, onError: (error, newTask, context) => { queryClient.setQueryData('tasks', context.previousTasks); }, onSettled: () => { queryClient.invalidateQueries('tasks'); }, });

这种方法提供了一个乐观更新的机制,用户在网络响应返回前就能看到更新的数据,从而提升了应用的响应性和用户体验。

3. 总结

通过以上方式,我们可以在React-query中有效地向现有数据添加新数据,并保持数据的同步和一致性。使用useMutationonMutateonSuccess回调来更新或回滚数据是一种在客户端处理数据更新的有效策略,这有助于提升应用的性能和用户体验。

2024年6月29日 12:07 回复

你的答案