在React-query中向现有数据添加新数据,通常适用于处理诸如用户提交表单后更新列表这类场景。我们可以通过几个步骤来实现这一功能:
1. 使用useQuery
和useMutation
首先,我们需要使用useQuery
来获取数据,然后使用useMutation
来添加新数据。useMutation
不仅可以用来发送数据到服务器,还可以通过其回调来更新本地的缓存数据。
示例代码
假设我们有一个任务列表,我们要向其中添加新任务:
jsimport { 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. 使用onMutate
或onSuccess
回调来修改缓存
在useMutation
中,onMutate
或onSuccess
回调可以用来直接修改缓存。这样,即使数据还未从服务器同步回来,用户界面也能即时反馈变化。
- onMutate: 在数据发送到服务器前,先更新客户端缓存。
- onSuccess: 在数据成功从服务器返回后,更新客户端缓存。
示例代码 - 使用onMutate
jsconst 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中有效地向现有数据添加新数据,并保持数据的同步和一致性。使用useMutation
的onMutate
或onSuccess
回调来更新或回滚数据是一种在客户端处理数据更新的有效策略,这有助于提升应用的性能和用户体验。
2024年6月29日 12:07 回复