React-Query๋ ์ฌ์ฉ์์๊ฒ ์๋ก์ด ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค ์ ์๋ ์ต์ ์ ์ ๊ณตํ๋ค.
useQuery๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ fetching ํ ์ ์์ผ๋ฉฐ HTTP GET ์์ฒญ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
useQuery๋ queryKey, queryFn, options๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
queryKey: Query๋ฅผ ์ ๋ํฌํ๊ฒ ์ง์นญํ ๋ฐฐ์ดqueryFn: Promise๋ฅผ ๋ฆฌํดํ๋ ํจ์options: ๋ค์ํ ์ต์
๋ค์ ์ ๋ฌํ ์ ์๋ ๊ฐ์ฒดReact-Query๋ฅผ ์ด์ฉํด ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํ๋ฉฐ HTTP POST, PUT, DELETE ์์ฒญ์ ์ฌ์ฉํ ์ ์๋ค. (C,U,D)
mutationFn
mutationFn ํ๋ผ๋ฏธํฐ๋ useMutation์ ๋ฆฌํด๊ฐ์ธ mutate ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๋ค. mutationFn์์๋ ์ด๋ป๊ฒ ๋์ํ ์ง ์ ์๋ง ํ๊ณ , mutate ํจ์๋ฅผ ํตํด ๋์ค์ ์คํ๋๋ ๊ฒ์ด๋ค.
// ๋ฐฉ๋ฒ1
const DeleteData = useMutation(() => axios.delete(`/api/delete/${fundId}`));
// ๋ฐฉ๋ฒ2
const DeleteData = useMutation({
mutationFn: (fundId) => axios.delete(`/api/delete/${fundId}`)
})
mutate
const { mutate } = () => deleteData();
const deleteFn = () => {
deleteData.mutate(fundId)
}
onSuccess, onError, onSettled
const deleteData = async () => {
try {
const response = await axios.delete(`/api/delete/${fundId}`)
.then((response) => console.log('๐๐ปํ๋ฉ ์์ฑ ์ฑ๊ณต', response.data))
}
catch (error) {
console.error("โํ๋ฉ ์์ฑ ์ค ์๋ฌ ๋ฐ์..", error);
}
finally {
console.log("๊ฒฐ๊ณผ๋ ์๊ด์์ด ๋ญ๊ฐ ์คํ๋จ")
}
}
// fn key๊ฐ ์๋ตver
const deleteData = useMutation((fundId) => axios.delete(`/api/delete/${fundId}`), {
onSuccess: () => { console.log('๐๐ปํ๋ฉ ์์ฑ ์ฑ๊ณต') },
onError: () => { console.error('โํ๋ฉ ์์ฑ ์ค ์๋ฌ ๋ฐ์') },
onSettled: () => { console.log('๊ฒฐ๊ณผ๋ ์๊ด์์ด ๋ญ๊ฐ ์คํ๋จ') }
})
// fn key๊ฐ ๋ช
์ver
const deleteData = useMutation({
mutationFn: () => axios.delete(`/api/delete/${fundId}`),
onSuccess: () => { console.log('๐๐ปํ๋ฉ ์์ฑ ์ฑ๊ณต') },
onError: () => { console.error('โํ๋ฉ ์์ฑ ์ค ์๋ฌ ๋ฐ์') },
onSettled: () => { console.log('๊ฒฐ๊ณผ๋ ์๊ด์์ด ๋ญ๊ฐ ์คํ๋จ') }
})
onSuccess, onError, onSettled๋ useMutation ์ ์ํ ๋ ๋ฟ๋ง ์๋๋ผ, mutate์์๋ ์ฌ์ฉ ๊ฐ๋ฅ
onMutate
const queryClient = useQueryClient((() => axios.post(`api/like/${id}`), {
onMutate: async (id) => {
// 'queryKey'๋ก ์งํ ์ค์ธ refetch ์ทจ์ํ์ฌ ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ๋ฎ์ด์ฐ์ง ์๋๋ก ํจ
await queryClient.cancleQueries({
queryKey: ['์ฟผ๋ฆฌํค']
})
// ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ด
const preData = queryClient.getQueryData(['์ฟผ๋ฆฌํค']);
// ์๋ก์ด ๊ฐ์ผ๋ก ๋๊ด์ ์
๋ฐ์ดํธ
queryClient.setQueryData(['์ฟผ๋ฆฌํค'], (prev) => !prev)
return { preData }
},
// mutation ์คํจ
onError: (err, newData, context) => {
// onMutate๋ก๋ถํฐ ๋ฐํ๋ context๋ฅผ ์ฌ์ฉํ์ฌ rollback
queryClient.setQueryData(['์ฟผ๋ฆฌํค'], context.previousData)
},
onSettled: () => {
// ์ฑ๊ณต, ์คํจ ์ฌ๋ถ์ ๊ด๊ณ์์ด refetch
queryClient.invalidateQueries({queryKey['์ฟผ๋ฆฌํค']})
}
});
invalidateQueries
const queryClient = useQueryClient(); // ๋ฑ๋ก๋ queryClient ๊ฐ์ ธ์ค๊ธฐ
const delete = useMutation(() => axios.delete(`/api/delete/${fundId}`), {
onSuccess: () => {
console.log('๐๐ปํ๋ฉ ์์ฑ ์ฑ๊ณต');
// ์์ฒญ ์ฑ๊ณต ์ ํด๋น queryKey ์ ํจ์ฑ ์ ๊ฑฐ
queryClient.invalidateQueries('์ฟผ๋ฆฌํค')
},
onError: () => { console.error('โํ๋ฉ ์์ฑ ์ค ์๋ฌ ๋ฐ์') },
onSettled: () => { console.log('๊ฒฐ๊ณผ๋ ์๊ด์์ด ๋ญ๊ฐ ์คํ๋จ') }
})