useMutation의 onMutate.
프로젝트를 진행하며, useQuery의 select만으로는 에러 핸들링이 부족하다고 생각되어 mutation의 데이터를 가지고 핸들링할 방법을 찾다가, onMutate를 발견했다.
onMutate 속성은 쿼리 실행 중 mutation이 발생했을 때 수행되는 콜백 함수를 설정하는 역할을 한다.
onMutate: (variables: TVariables) => Promise<TContext | void> | TContext | void Optional
This function will fire before the mutation function is fired and is passed the same variables the mutation function would receive Useful to perform optimistic updates to a resource in hopes that the mutation succeeds The value returned from this function will be passed to both the onError and onSettled functions in the event of a mutation failure and can be useful for rolling back optimistic updates.
onMutate: (variables: TVariables) => Promise<TContext | void> | TContext | void Optional
이 함수는 mutation 함수가 실행되기 전에 실행되며 mutation 함수가 받을 변수와 동일한 변수를 전달받습니다.
mutation이 성공할 것을 기대하여 리소스에 대한 낙관적인 업데이트를 수행하는 데 유용합니다. 이 함수에서 반환된 값은 mutation 실패 시 onError 및 onSettled 함수로 전달되며, 낙관적 업데이트를 롤백하는 데 유용할 수 있습니다.
아래는 onMutate 콜백을 사용하여 뮤테이션을 실행하기 전에 낙관적 업데이트를 수행하고, 실패 시 롤백하는 코드이다.
실패 시 onError 콜백을 사용하여 롤백 로직을 수행하고, onSettled 콜백을 사용하여 뮤테이션 완료 후 추가 작업을 수행할 수 있다.
import { useMutation } from 'react-query';
// addTodo 뮤테이션 함수 정의
const addTodo = async (newTodo) => {
// 서버로 To-Do 항목 추가 요청 보내는 비동기 작업
// 이 부분에서 실제 서버 요청을 보낸다.
// 성공 시 데이터 반환, 실패 시 오류 throw
};
function TodoApp() {
const { mutate } = useMutation(addTodo, {
onMutate: (newTodo) => {
// 낙관적 업데이트를 위한 컨텍스트 생성
const optimisticTodo = {
id: Date.now(), // 임시 ID 생성
text: newTodo,
completed: false,
};
// 낙관적 업데이트를 수행
// 여기서는 예시로 간단히 로컬 상태에 추가 하지만,
// 실제로는 상태 관리 라이브러리나 컨텍스트 API를 사용할 수 있다.
// 이 부분에서는 서버 요청 전이므로, 실패 시 롤백할 수 있다.
// 롤백 시 이 데이터를 사용하여 낙관적 업데이트를 롤백할 수 있다.
return optimisticTodo;
},
onError: (error, variables, context) => {
// 뮤테이션 실행 중 오류 발생 시 호출됩.
// 롤백을 수행하거나 오류 처리를 할 수 있다.
console.error('뮤테이션 실패:', error);
// context를 활용하여 낙관적 업데이트 롤백
if (context) {
console.log('낙관적 업데이트 롤백:', context);
// 여기에서 롤백 로직을 수행.
}
},
onSettled: (data, error) => {
// 뮤테이션이 완료(성공 또는 실패)된 후 호출.
// 성공 또는 실패 여부에 관계없이 이곳에서 추가 작업을 수행할 수 있다.
if (data) {
console.log('뮤테이션 성공:', data);
} else if (error) {
console.error('뮤테이션 실패:', error);
}
},
});
const handleAddTodo = (newTodo) => {
// 뮤테이션 호출
mutate(newTodo);
};
// 나머지 컴포넌트 렌더링 및 이벤트 핸들링
}
export default TodoApp;
'기록 > TIL' 카테고리의 다른 글
2023.09.04 (0) | 2023.09.04 |
---|---|
2023.09.01 (0) | 2023.09.01 |
2023.08.30 (0) | 2023.08.30 |
2023.08.29 (0) | 2023.08.29 |
2023.08.28 (0) | 2023.08.28 |