[React] React Query (1)


React Query

React-query를 이용한 상태관리를 공부해보자 공식 홈페이지

Query Key

Key, Value 맵핑구조와 유사

  • React Query는 Query Key에 따라 query chching을 관리한다. -. String 형태 -. Array 형태

Query Function

Promise를 반환하는 함수로 데이터를 resolve하거나 error throw

useQuery의 대표적인 반환값

const {
  data,
  error,
  isFetching,
  status,
  isLoading,
  isSuccess,
  refetch,
  remove,
  ...
}

ㅁ data: 마지막으로 성공한 resolved된 데이터(Response) ㅁ error: 에러가 발생했을 때 반환되는 객체 ㅁ isFetching: Request가 in-flight중일 때 true ㅁ status, isLoading, isSuccess 등: 현재 query의 상태 ㅁ refetch: 해당 query refetch하는 함수 제공 ㅁ remove: 해당 query cache에서 지우는 함수 제공

useQuery의 대표적인 Option

} = useQuery(queryKey, queryFn?,{
  onSuccess,
  onError,
  onSettled,
  enabled,
  reyty,
  select,
  keepPreviousData,
  refetchInterval
})

ㅁ onSuccess, onError, onSettled: query fetching 성공,실패,완료 시 실행할 side Effect정의 ㅁ enable: 자동을 query를 실행시킬지 말지 여부 ㅁ retry: query동작 실패 시 자동으로 retry 할지 결정하는 옵션 ㅁ select: 성공 시 가져온 data를 가공해서 전달 ㅁ keepPreviousData: 새롭게 fetching시 이전 데이터 유지 여부 ㅁ refetchInterval: 주기적으로 refetch할지 결정하는 옵션

query가 여러 개일 때

function App () {
  <!-- 알아서 병렬로 진행해  -->
  const usersQuery = useQuery('users', fetchUsers)
  const teamsQuery = useQuery('teams', fetchTeams)
  const projectsQuery = useQuery('projects', fetchProjects)
}

Mutaiton

Data를 생성/수정/삭제 에 사용

const mutation = useMutation(newTodo => {
  return axios.post('/todos', newTodo)
})

const {
  data,
  error,
  isError,
  isIdle,
  isLoading,
  isPaused,
  isSuccess,
  mutate,
  mutateAsync,
  reset,
  status
} = useMutation(mutationFn,{
  mutationKey,
  onError,
  onMutate,
  onSettled,
  onSuccess,
  retry,
  retryDelay,
  useErrorBoundary,
  meta
  })

-. query와 달리 자동으로 실행 X -. useQuery보다 더 심플하게 Promise 반환 함수만 있어도 가능(단, Query Key 넣어주면 devtools에서 확인 가능)

-. mutate: mutation을 실행하는 함수 -. mutateAsync: mutate와 비슷하지만, Promise 반환 -. reset: mutation 내부 상태 clean -. 나머지는 useQuery와 비슷함

-. onMutate: 본격적인 Mutation동작 전에 먼저 동작하는 함수, Optimistic update 적용 시 유용

OptimisticUI update ex) 페이스북 좋아요 버튼과 같은 경우 누름과 동시에 색 변경이 먼저 진행(API 통신은 성공할 것이라는 예상(optimistic한 기대와 함께 선 동작)), 실패 시 rollback

Query Invalidation

-. 간단히 queryClient를 통해 invalidation 메소드를 호출

//Invalidate every quert in cache
queryClient.invalidateQueris()
//Invalidate every query with a key that starts with 'todos'
queryClient.invalidateQueris('todos')

해당 Key를 가진 query는 stale 취급되고, 현재 rendering되고 있는 query들은 백그라운드에서 refetch

댓글남기기