[React] useMutation를 활용한 데이터 생성, 수정, 삭제

2023. 2. 6. 21:41·🍞 FrontEnd/React

useQuery와 매우 유사하지만 많은 차이가 있다.

 

✅ useQuery와 useMutation차이

- 일회성이기 때문에 캐시 데이터가 없다.

페칭이나 리페칭 그리고 업데이트할 데이터가 있는 useQuery와 다르다.

 

- 기본적으로 구성할 수는 있지만, 재시도가 없다.

useQuery는 기본적으로 세 번 재시도한다. 

 

- 관련된 데이터가 없으므로 리페치도 없다.

 

- 캐시 데이터가 없으므로 isLoading은 없고 isFetching만 있다.

isLoading은 데이터가 없을 때 이루어지는 페칭이기 때문이다. 

 

- useMutation은 반환 객체에서 mutate 함수를 반환한다. 이것이 변이를 실행하는 데 사용된다.

 

- onMutate 콜백도 있다. 이것을 낙관적 쿼리에 사용하는데 변이가 실패할 때 복원할 수 있도록 이전 상태를 저장하는 데 사용한다.

 

 

useMutation | TanStack Query Docs

const { data,

tanstack.com

 

✅ useMutation을 통해 데이터 생성, 수정, 삭제

이후 이벤트 핸들러나 함수 내에서 mutate를 일으키면 된다. 이때 해당 API가 호출 성공할 경우 invalidateQueries를 통해 stale date가 모두 refetch 된다.

 

👉 생성

invalidateQuires 정말 좋은 옵션...✨

const addItem = useMutation((item: Item) => createItem(item), {
    onSuccess: (data) => {
      console.log(data);
      queryClient.invalidateQueries(queryKeys.items);
    },
    onError: (error) => {
      console.log(error);
    },
  });

...

 const onSubmit: SubmitHandler<IFormInput> = (data) => {
    const Item = {
      id: uuidv4(),
    };
    const newItem = Object.assign(Item, data);
    addItem.mutate(newItem);
  };

👉 삭제

그리고 삭제하기 버튼이 눌렸을 때 해당 이벤트 핸들러가 작동하도록 해준다.

const deleteItem = useMutation((id: string) => deleteById(id), {
    onSuccess: (data) => {
      console.log(data);
      queryClient.invalidateQueries(queryKeys.items);
    },
    onError: (error) => {
      console.log(error);
    },
  });

...

 const handleDelete = (id: string) => {
    deleteItem.mutate(id);
  };

👉 수정

수정도 매우 유사하게 동작된다.
다만 코드 내 UI관련 state로 인해 조금 길어지나 내용은 동일하다.

const editItem = useMutation((item: Item) => createItem(item), {
    onSuccess: (data) => {
      console.log(data);
      setEditable(!editable);
      queryClient.invalidateQueries(queryKeys.items);
    },
    onError: (error) => {
      console.log(error);
    },
  });

...

 const handleEdit = (id: string, name: string, price: number) => {
    setEditable(true);
    setClickedId(id);
    setMenuInputVal(name);
    setPriceInputVal(price);
    const editObj = {
      id: clickedId,
      name: menuInputVal,
      price: priceInputVal,
    };
    editItem.mutate(editObj);
  };
 

AWS와 React Query를 활용한 CRUD 만들기

오늘은 동아리 세미나때 함께 제공하기 위해 준비한 작고 귀여운 예제를 어떻게 만들었는지 공유해드릴려고 합니다.

velog.io

 

저작자표시 (새창열림)

'🍞 FrontEnd > React' 카테고리의 다른 글

[WebSocket, stompjs] 채팅 기능 client null 값  (0) 2023.08.14
[React] File과 JSON 동시에 주고 받기 (Multipart/form-data)  (0) 2023.02.12
[React] 리페칭(Re-fetching)에 대해서  (0) 2023.02.06
[React] Recoil-persist 사용해보기  (0) 2023.02.03
[React] CORS 에러 해결하기  (0) 2023.01.30
'🍞 FrontEnd/React' 카테고리의 다른 글
  • [WebSocket, stompjs] 채팅 기능 client null 값
  • [React] File과 JSON 동시에 주고 받기 (Multipart/form-data)
  • [React] 리페칭(Re-fetching)에 대해서
  • [React] Recoil-persist 사용해보기
박빵이
박빵이
2025년에도 갓생살기
  • 박빵이
    기억보다 기록
    박빵이
  • 전체
    오늘
    어제
    • 분류 전체보기 (337)
      • 🍞 FrontEnd (97)
        • HTML+CSS (4)
        • JavaScript (17)
        • TypeScript (4)
        • React (52)
        • Next.js (2)
        • Android (15)
      • 🍞 BackEnd (24)
        • Java (15)
        • Node.js (6)
        • Spring (1)
      • 🍞 Cloud & Infra (0)
        • AWS SAA (0)
        • Microsoft Azure (0)
      • 🍞 Algorithm (147)
        • C++ (4)
        • Baekjoon (41)
        • Programmers (97)
      • 🍞 Computer Science (18)
        • 운영체제 (1)
        • 데이터 통신 (6)
        • 네트워크 (6)
        • 데이터베이스 (1)
      • 🍞 대외활동 & 부트캠프 (42)
        • 삼성 청년 SW 아카데미 (1)
        • LG유플러스 유레카 (0)
        • 한국대학생IT경영학회 (1)
        • IT연합동아리 UMC (17)
        • 길벗 블로깅 멘토 (18)
        • IT연합동아리 피로그래밍 (3)
        • 개발 컨퍼런스 (2)
  • 블로그 메뉴

    • Admin
  • 링크

    • GitHub
  • 인기 글

  • 태그

    안드로이드
    위상정렬
    map
    umc
    코틀린
    Java
    react
    Android
    level1
    길벗 블로깅 멘토
    알고리즘
    JavaScript
    level2
    길벗 블로깅 멘토링
    코딩자율학습
    백준
    C++
    Front
    유니온파인드
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
박빵이
[React] useMutation를 활용한 데이터 생성, 수정, 삭제
상단으로

티스토리툴바