如何从同一个组件调用同一个查询?

How do I call the same query from the same component?

我的查询设置如下:

   ...
   doesProjectExist: build.query({
     query: (projectNumber) => ({
     url: `${URL}/exists/${projectNumber}`,
     method: "GET",
   }),
...

export const {
  useDoesProjectExistQuery
} = projectsSlice;

当用户选择一个项目时,将调用此查询以查看它是否存在。

  const {
    data: existingProject,
    isLoading: isLoadingExistingProject,
    isSuccess: isSuccessExistingProject,
  } = useDoesProjectExistQuery(
    projectToCheckIfExists ? projectToCheckIfExists.projectNumber : skipToken
  );

  useEffect(() => {
    console.log("Existing Project", existingProject);
    console.log("Loading Existing Project", isLoadingExistingProject);
    console.log("Success Existing Project", isSuccessExistingProject);
  }, [existingProject, isLoadingExistingProject, isSuccessExistingProject]);

使用效果吐出结果3次,其中2次显示isSuccess = true,但1次existing project为true,1次为false,无法评估。

如果我将查询更改为突变并像这样解构挂钩:

  const [doesProjectExist, { isLoading }] =
    useDoesProjectExistMutation(skipToken);

我可以随意调用 doesProjectExist 并解包结果。有没有办法直接调用和解包查询?使用突变似乎是错误的。我觉得我错过了一些简单的东西!

我想这是预期的行为。 当您将 isLoadingExistingProjectisSuccessExistingProject 都设置为 false 时的情况 - 很可能是您通过 skipToken 时的情况,因为 projectToCheckIfExists 可能是 undefined 在生命周期变化期间。

为了更清楚地调查它,尝试做一些更直接的事情:

const {
    data: existingProject,
    isLoading: isLoadingExistingProject,
    isSuccess: isSuccessExistingProject,
  } = useDoesProjectExistQuery(
     projectToCheckIfExists?.projectNumber, 
     { skip: !projectToCheckIfExists}
  );

useDoesProjectExistQuery 可能不会期望参数中有 undefined,但是你可以让它处理 undefined,或者像 projectToCheckIfExists?.projectNumber ?? 0 这样对参数添加一些空检查,由于 skip 条件,它永远不会通过。

不如您使用 skipToken 的符号清晰,但它应该更易于预测。