import { useQuery, useMutation } from '@tanstack/react-query';
const YourComponent = () => {
// a라는 GET 요청을 수행하는 query
const { data: dataA } = useQuery('getDataA', async () => {
const response = await yourApiCallForA();
return response.data;
});
// b라는 POST 요청을 수행하는 mutation
const { mutate: mutateB, data: dataB } = useMutation(
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
onSuccess: (data) => {
// data.status가 없을 경우 계속해서 b 요청을 보냄
if (!data.status) {
const hash = data.hash; // 혹시라도 받아온 hash가 있다면 사용
// 여기서 다시 b라는 POST 요청을 보냄
mutateB(hash);
} else if (data.status === true) {
// data.status가 true인 경우 b라는 GET 요청을 수행하는 query
queryClient.invalidateQueries('getDataB');
}
},
}
);
// b라는 GET 요청을 수행하는 query
const { data: dataBAfterGet } = useQuery('getDataB', async () => {
const response = await yourApiCallForBAfterGet();
return response.data;
});
// 만약 b의 GET 요청 결과에서 hash를 얻을 수 있다면 다시 b라는 POST 요청을 보냄
if (dataBAfterGet && dataBAfterGet.hash) {
mutateB(dataBAfterGet.hash);
}
return (
<div>
{/* Your component rendering logic */}
</div>
);
};
만약 커스텀 훅으로 만든다면
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
const useCustomLogic = () => {
const queryClient = useQueryClient();
const { data: dataA } = useQuery('getDataA', async () => {
const response = await yourApiCallForA();
return response.data;
});
const { mutate: mutateB, data: dataB } = useMutation(
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
onSuccess: (data) => {
if (!data.status) {
const hash = data.hash;
mutateB(hash);
} else if (data.status === true) {
queryClient.invalidateQueries('getDataB');
}
},
}
);
const { data: dataBAfterGet } = useQuery('getDataB', async () => {
const response = await yourApiCallForBAfterGet();
return response.data;
});
if (dataBAfterGet && dataBAfterGet.hash) {
mutateB(dataBAfterGet.hash);
}
return {
dataA,
dataB,
dataBAfterGet,
};
};
export default useCustomLogic;
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
const useCustomLogic = () => {
const queryClient = useQueryClient();
// a라는 POST 요청을 수행하는 mutation
const { mutate: mutateA } = useMutation(
async (payload) => {
const response = await yourApiCallForA(payload);
return response.data;
}
);
// b라는 GET 요청을 수행하는 query
const { data: dataB } = useQuery(
'getDataB',
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
enabled: false, // 초기에는 비활성화
}
);
// c라는 POST 요청을 수행하는 mutation
const { mutate: mutateC } = useMutation(
async (hash) => {
const response = await yourApiCallForC(hash);
return response.data;
},
{
onSuccess: (data) => {
// c 요청이 성공하면 b(GET) 요청을 다시 보냄
queryClient.invalidateQueries('getDataB');
mutateB(data.hash);
},
}
);
// b라는 GET 요청을 수행하는 mutation
const { mutate: mutateB } = useMutation(
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
onSuccess: (data) => {
// data.status가 없을 경우 계속해서 b 요청을 보냄
if (!data.status) {
const hash = data.hash;
queryClient.invalidateQueries('getDataB');
mutateB(hash);
} else if (data.status === true) {
// data.status가 true인 경우 c라는 POST 요청을 실행해 받아온 데이터의 hash값으로 다시 b(GET) 요청을 보냄
queryClient.invalidateQueries('getDataB');
mutateC(data.hash);
}
},
}
);
return {
mutateA,
mutateB,
mutateC,
dataB,
};
};
export default useCustomLogic;
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
const useCustomLogic = () => {
const queryClient = useQueryClient();
// A라는 POST 요청을 수행하는 mutation
const { mutate: mutateA } = useMutation(
async (payload) => {
const response = await yourApiCallForA(payload);
return response.data.hash; // A 요청에서 반환되는 hash값을 추출
}
);
// B라는 GET 요청을 수행하는 query
const { data: dataB } = useQuery(
'getDataB',
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
enabled: false, // 초기에는 비활성화
}
);
// C라는 POST 요청을 수행하는 mutation
const { mutate: mutateC } = useMutation(
async (param) => {
const response = await yourApiCallForC(param);
return response.data.hash; // C 요청에서 반환되는 hash값을 추출
},
{
onSuccess: (hash) => {
// C 요청이 성공하면 B(GET) 요청을 다시 보냄
queryClient.invalidateQueries('getDataB');
mutateB(hash);
},
}
);
// B라는 GET 요청을 수행하는 mutation
const { mutate: mutateB } = useMutation(
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
onSuccess: (data) => {
// data.status가 undefined이거나 data가 없는 경우 다시 B(GET) 요청을 보냄
if (!data || data.status === undefined) {
queryClient.invalidateQueries('getDataB');
mutateB(data.hash);
} else if (data.status === true) {
// data.status가 true인 경우 C(POST) 요청을 보내고, C 요청 결과값으로 다시 B(GET) 요청을 보냄
queryClient.invalidateQueries('getDataB');
mutateC(yourCParam); // yourCParam은 C 요청에 필요한 매개변수입니다.
}
},
}
);
return {
mutateA,
mutateB,
mutateC,
dataB,
};
};
export default useCustomLogic;
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
const useCustomLogic = () => {
const queryClient = useQueryClient();
// A라는 POST 요청을 수행하는 mutation
const { mutate: mutateA } = useMutation(
async (payload) => {
const response = await yourApiCallForA(payload);
return response.data.hash; // A 요청에서 반환되는 hash값을 추출
}
);
// B라는 GET 요청을 수행하는 query
const { data: dataB } = useQuery(
'getDataB',
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
enabled: false, // 초기에는 비활성화
}
);
// C라는 POST 요청을 수행하는 mutation
const { mutate: mutateC } = useMutation(
async (param) => {
const response = await yourApiCallForC(param);
return response.data.hash; // C 요청에서 반환되는 hash값을 추출
}
);
// B라는 GET 요청을 수행하는 mutation
const { mutate: mutateB } = useMutation(
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
onSuccess: (data) => {
// data.status가 undefined이거나 data가 없는 경우 다시 B(GET) 요청을 보냄
if (!data || data.status === undefined) {
queryClient.invalidateQueries('getDataB');
mutateB(data.hash);
} else if (data.status === true) {
// data.status가 true인 경우 C(POST) 요청을 보내고, C 요청 결과값으로 다시 B(GET) 요청을 보냄
queryClient.invalidateQueries('getDataB');
mutateC(yourCParam); // yourCParam은 C 요청에 필요한 매개변수입니다.
}
},
}
);
// A, B, C 요청을 연결하여 실행하는 함수
const performRequests = async (payload) => {
const hash = await mutateA(payload);
mutateB(hash);
};
return {
performRequests,
dataB,
};
};
export default useCustomLogic;
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
const useCustomLogic = () => {
const queryClient = useQueryClient();
// A라는 POST 요청을 수행하는 mutation
const { mutate: mutateA } = useMutation(
async (payload) => {
const response = await yourApiCallForA(payload);
return response.data.hash; // A 요청에서 반환되는 hash값을 추출
}
);
// B라는 GET 요청을 수행하는 query
const { data: dataB } = useQuery(
'getDataB',
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
enabled: false, // 초기에는 비활성화
}
);
// C라는 POST 요청을 수행하는 mutation
const { mutate: mutateC } = useMutation(
async (param) => {
const response = await yourApiCallForC(param);
return response.data.hash; // C 요청에서 반환되는 hash값을 추출
},
{
onSuccess: (hash) => {
// C 요청이 성공하면 B(GET) 요청을 다시 보냄
queryClient.invalidateQueries('getDataB');
mutateB(hash);
},
}
);
// B라는 GET 요청을 수행하는 mutation
const { mutate: mutateB } = useMutation(
async (hash) => {
const response = await yourApiCallForB(hash);
return response.data;
},
{
onSuccess: (data) => {
// data.status가 undefined이거나 data가 없는 경우 다시 B(GET) 요청을 보냄
if (!data || data.status === undefined) {
queryClient.invalidateQueries('getDataB');
mutateB(data.hash);
} else if (data.status === true) {
// data.status가 true인 경우 C(POST) 요청을 보내고, C 요청 결과값으로 다시 B(GET) 요청을 보냄
mutateC(yourCParam); // yourCParam은 C 요청에 필요한 매개변수입니다.
}
},
}
);
return {
mutateA,
mutateB,
mutateC,
dataB,
};
};
export default useCustomLogic;