참고사이트
mutationFn
// 첫 번째 방법
const deleteData = useMutation(() => axios.delete(`api/delete/${id}`));
// 두 번째 방법
const deleteData = useMutation({
mutationFn: (id) => axios.delete(`api/delete/${id}`)
})
mutate
const { mutate } = () => deleteData()
const deleteFn = () => {
deleteData.mutate(id)
}
onSuccess, onError, onSettled
const deleteData = async () => {
try{
const res = await axios.delete(`api/delete/${id}`)
.then((res) => console.log(res.data))
} catch(err) {
console.error('error', err.message)
} finally {
console.log('어쨌든 실행되는 부분')
}
}
// fn key 값 생략된 버전
const deleteData = useMutation((id) => axios.delete(`api/delete/${id}`), {
onSuccess: () => { console.log('요청 성공') },
onError: () => { console.error('에러 발생') },
onSettled: () => { console.log('결과에 관계 없이 무언가 실행됨') }
})
// fn key 값 명시된 버전
const deleteData = useMutation({
mutationFn: (id) => axios.delete(`api/delete/${id}`),
onSuccess: () => { console.log('요청 성공') },
onError: () => { console.error('에러 발생') },
onSettled: () => { console.log('결과에 관계 없이 무언가 실행됨') }
})
React query는 낙관적 업데이트를 지원하며, 서버의 데이터 업데이트가 성공하기 전에도 UI를 업데이트 할 수 있게 한다.
서버와의 데이터 동기화를 신경쓰지 않고 먼저 사용자에게 성공 시 UI를 보여준 후, 요청의 결과가 오면 성공/실패 여부에 따라 UI 업데이트
사용자는 서버와의 통신 여부와 관계 없이 UI를 확인할 수 있게 됨
예: 인스타그램의 좋아요 기능, 카카오톡이 일단 전송된 후 성공, 취소/재전송 창이 나중에 뜨는 것
onMutate
const queryClient = useQueryClient(() => axios.post(`api/like/${id}`), {
onMutate: async (id) => {
// 'queryKey'로 진행 중인 refetch 취소하여 낙관적 업데이트를 덮어쓰지 않도록 함
await queryClient.cancleQueries({
queryKey: ['queryKey]
})
// 이전 데이터를 받아옴
const previousData = queryClient.getQueryData(['queryKey']);
// 새로운 값으로 낙관적 업데이트
queryClient.setQueryData(['queryKey'], (prev) => !prev)
return { previousData }
},
// mutation이 실패한 경우
onError: (err, newData, context) => {
// onMutate로부터 반환된 context를 사용하여 rollback
queryClient.setQueryData(['queryKey'], context.previousData)
},
onSettled: () => {
// 성공, 실패 여부에 관계 없이 refetch
queryClient.invalidateQueries({queryKey: ['queryKey']})
}
});
const deleteData = useMutation({
})
invalidateQuries
const queryClient = useQueryClient(); // 등록된 queryClient를 가져옴
const deleteData = useMutation((id) => axios.delete(`api/delete/${id}`), {
onSuccess: () => {
console.log('요청 성공');
// 요청 성공 시 해당 queryKey 유효성 제거
queryClient.invalidateQueries('queryKey')
},
onError: () => { console.error('에러 발생') },
onSettled: () => { console.log('결과에 관계 없이 무언가 실행됨') }
})