ค้นหาเว็บไซต์

reactjs - useMutation ขึ้นอยู่กับ useQuery isError


ฉันมี useQuery hook ที่รับ id ทำการค้นหาฐานข้อมูลและส่งกลับสองผลลัพธ์ที่เป็นไปได้ คือ พบแถวและส่งมันกลับพร้อมกับ สถานะ HTTP 200 หรือไม่พบและส่งกลับ สถานะ HTTP 404

ถ้า 404 ถูกส่งกลับ ค่า isError ของ useQuery จะเป็นจริง ผมตรวจสอบ isError และตรวจสอบรหัสสถานะสำหรับ 404 ถ้าทุกอย่างนั้นเป็นจริง ผมต้องการเรียกฟังก์ชัน mutate

ฉันกำลังใช้ @tanstack/react-query v5 นี่คือสิ่งที่ฉันได้ลองทำ ทุกอย่างนี้อยู่ในไฟล์ที่ต่างกัน

นี่คือ useQuery

const getUser = async (cnum: string) => {
  const { data } = await api.get<UserInfo>(`/users/get/${cnum}`);
  return data;
};

export const useGetUserQuery = () => {
  const auth = useAuth();
  const cnum = auth.user?.profile.uid as string;

  return useQuery({
    queryKey: ['user', 'get', cnum],
    queryFn: () => getUser(cnum),
    enabled: !!auth && !!cnum,
    staleTime: Infinity,
  });
};

นี่คือ useMutation

const createUser = async (user: NewUser) => {
  const { data } = await api.post<UserInfo>(`/users/create`, user);
  return data;
};

export const useCreateUserMutation = () => {
  const queryClient = useQueryClient();
  const auth = useAuth();
  const user: NewUser = {
       // properties here
  }

  return useMutation({
    mutationKey: ['user', 'create', user],
    mutationFn: () => {
      return createUser(user);
    },
    onSuccess: async (data) => {
      await queryClient.invalidateQueries(
        {
          queryKey: ['user', 'get', data.cnum],
          refetchType: 'all', //using 'all' since I understand that the query won't be active since it is in error state, I could be wrong.
        },
      );
    },
  });
};

ในไฟล์ App.tsx ฉันกำลังทำสิ่งต่อไปนี้:

function App() {
const userInfo = useGetUserQuery();
const createUser = useCreateUserMutation();


if (userInfo.isSuccess) {
    sessionStorage.setItem('user', JSON.stringify(userInfo.data));
  }

if (userInfo.isError) {
    const submit = async () => {
      try {
        await createUser.mutateAsync();
      } catch (e) {
        console.log('error', e);
      }
    };
    void submit();
  }

return (
  ...
)
}

ฉันกำลังคาดหวังว่าเมื่อการเปลี่ยนแปลงสำเร็จ useQuery ก่อนหน้านี้จะถูกยกเลิกและดึงข้อมูลใหม่ ซึ่งจากนั้น (หวังว่า) จะคืนค่าผู้ใช้ใหม่ที่สร้างขึ้น ไม่แน่ใจว่าฉันสามารถตั้งค่าข้อมูลของ useQuery โดยตรงเมื่อการเปลี่ยนแปลงสำเร็จได้หรือไม่

สิ่งที่ฉันได้ดูเหมือนจะเป็นลูปไม่สิ้นสุด ซึ่งฟังก์ชัน mutate ถูกเรียกซ้ำๆ