reactjs React Query的Race条件

brccelvz  于 2023-06-29  发布在  React
关注(0)|答案(1)|浏览(75)

我试图创建一个Todo应用程序与React查询,我面临的竞争条件问题。我有一个待办事项页面,用户更新/创建新的待办事项,并单击保存。取决于用户因特网连接,保存过程可能花费大约3秒。编辑完待办事项后,用户仍停留在待办事项页面中。创建新的待办事项后,用户将被导航到待办事项页面。
问题是,当用户创建/更新一个todo,然后单击show todo modal(这是外部组件,我不能编辑它),modal在编辑之前显示todo/如果它是新的todo,则为空
当我调试这个问题时,我可以看到react查询在模式打开后获取todo。如果我关闭模式并再次打开它,它将显示更新的todo。

const {todo} = useTodoQuery()

const openModal = () => modal.open(todo)

return (
   <TodoModalButton onClick={openModal}>Open Todo Preview Modal</TodoModalButton>
)
const useTodoQuery = () => {
  const {data, ...rest} = useQuery(['todo', todoId], async () => {
    if (todoId) {
      return await getTodo(todoId)
    }
    return null;
  })

  return {data, ...rest}
}
const queryClient = new QueryClient({
  defaultOptions: {
    suspense: false,
    keepPreviousData: true,
  }
})

如果我删除keepPreviousData,todo将是undefined。

const todoMutation = useMutation(
    ['todo'],
    getUpdatedTodo,
    {onSuccess: () => queryClient.invalidateQueries(['todo', todoId])}
  );

我试过使用{onSuccess: (todo) => queryClient.setQueryData(['todo', todoId], todo)},但它没有工作得很好。

polkgigr

polkgigr1#

只需等待onSuccess回调和打开模型后:)解决:D
如果不可能,请提供更多细节

相关问题