logo
React Query useMutation
2024-11-26
REACTREACT-QUERY

React Query useMutation 사용법

React Query는 React 앱에서 데이터를 fetch하고 캐시하는 것을 간단하게 만들어주는 라이브러리입니다. useMutation은 React Query에서 제공하는 함수 중 하나로, 데이터를 create, update, delete하는데 사용됩니다.

useMutation 사용법

useMutation 함수는 두 개의 인자를 받습니다. 첫 번째 인자는 mutation 함수이고, 두 번째 인자는 옵션 객체입니다.

mutation 함수

mutation 함수는 비동기로 데이터를 create, update, delete하는 함수입니다. mutation 함수는 async/await를 사용하여 구현합니다.

const createTodo = async (newTodo) => { const response = await fetch("/api/todos", { method: "POST", body: JSON.stringify(newTodo), headers: { "Content-Type": "application/json", }, }); return response.json(); };

옵션 객체

옵션 객체는 다음과 같은 속성을 가질 수 있습니다.

  • mutationKey: mutation을 식별할 수 있는 고유한 값입니다. mutation 함수 이름과 같은 값으로 설정하는 것이 좋습니다.
  • onSuccess: mutation 함수 실행이 성공적으로 완료되었을 때 실행되는 함수입니다.
  • onError: mutation 함수 실행이 실패했을 때 실행되는 함수입니다.
const options = { mutationKey: "createTodo", onSuccess: (data) => { console.log("Todo created successfully!", data); }, onError: (error) => { console.error("Error creating todo!", error); }, };

useMutation Hook

useMutation Hook은 mutation 함수와 옵션 객체를 인자로 받습니다. 반환값은 배열로, 첫 번째 요소는 mutate 함수이고, 두 번째 요소는 mutation 상태 정보가 담긴 객체입니다.

import { useMutation } from "react-query"; const CreateTodoForm = () => { const [newTodo, setNewTodo] = useState(""); const [mutate, { isLoading, error, data }] = useMutation(createTodo, options); const handleNewTodoChange = (event) => { setNewTodo(event.target.value); }; const handleCreateTodo = () => { mutate({ title: newTodo }); setNewTodo(""); }; return ( <form onSubmit={handleCreateTodo}> <input type='text' value={newTodo} onChange={handleNewTodoChange} /> <button type='submit' disabled={isLoading}> {isLoading ? "Creating Todo..." : "Create Todo"} </button> {error && <div>Error creating todo!</div>} {data && <div>Todo created successfully!</div>} </form> ); };

위 코드는 CreateTodoForm 컴포넌트를 구현한 예시입니다. useMutation Hook을 사용하여 createTodo 함수와 options 객체를 전달하고, 반환된 mutate 함수를 이용하여 데이터를 생성합니다. isLoading, error, data 상태 정보를 이용하여 mutation 상태를 표시합니다.

me

Kyung Won Kang