νλ‘ νΈμλλ₯Ό κ°λ°νλ€λ³΄λ©΄ ꡬνμ κ°λ¨νμ§λ§ λ²κ±°λ‘μ΄ μμ λ€μ΄ λͺλͺ μμ΅λλ€. μΊμ±, ν¨μΉ, μ λ°μ΄νΈ, API ν΅μ , λ‘λ©, 무νμ€ν¬λ‘€ λ±λ±λ±... μ΄λ° κ°λ°μμ μκ³ λ₯Ό λμ΄μ£Όλ λΌμ΄λΈλ¬λ¦¬ React Queryλ₯Ό μκ°ν©λλ€. μ΄λ² ν¬μ€νΈμμ λνμ μΈ κΈ°λ₯ λͺ κ°μ§λ₯Ό μμ±ν΄λ³΄κ² μ΅λλ€.
RQμ κ°μ₯ λνμ μΈ κΈ°λ₯ uesQuery
λ λΉλκΈ° λ‘μ§μμ μλνλλ‘ μ€κ³λμκ³ , api ν΅μ μ€ Promise
λ₯Ό ν΅ν GET μ μλ²μμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ λ μ μ©ν μ¬μ©λ©λλ€.
useQuery()μ κΈ°λ³Έμ μΈ μ¬μ©λ²μ λ€μκ³Ό κ°μ΅λλ€.
result
= uesQuery(μ λν¬ μΈλ±μ€
, ν¨μ
);
const result = useQuery('todos', getTodos);
λ³μ resultμλ λ€μκ³Ό κ°μ κ°μ΄ ν¬ν¨λμ΄ μμ΅λλ€.
- isLoadingλλ status === 'loading'- 쿼리μ λ°μ΄ν°κ° μμΌλ©° κ°μ Έμ€λ μ€
- isError λλ status === 'error'- 쿼리μ μ€λ₯ λ°©μ
- isSuccess λλ status === 'success'- 쿼리λ₯Ό μ±κ³΅νμ¬ λ°μ΄ν° μ¬μ©κ°λ₯
- isIdle λλ status === 'idle'- νμ¬μ μΏΌλ¦¬κ° λΉνμ±ν
μ΄λ₯Ό ν΅ν μΌλ°μ μΈ μ¬μ©λ²μ λ€μκ³Ό κ°μ΅λλ€.
function Todos() {
const { isLoading, isError, data, error } = useQuery('todos', fetchTodoList)
if (isLoading) {
return <span>Loading...</span>
}
if (isError) {
return <span>Error: {error.message}</span>
}
// `isSuccess === true` λΌκ³ κ°μ ν μ μμ.
return (
<ul>
{data.map(todo => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
μμ μμ λ 곡μλ¬Έμμ κ°λ¨ν todo μμ μ λλ€. μ€μ μμ μμ μ΄λ»κ² μ¬μ©νλμ§ νμΈν΄λ³΄κ² μ΅λλ€.
//data: [λΆλ₯Ό μ΄λ¦], ...
//useQuery λ±μ μ€λ³΅μΌλ‘ μ¬μ©ν μ μκΈ°μ κ° ν¨μλ³λ‘ μ΄λ¦μ μ μΈν©λλ€.
const { data: geoData, isSuccess: geoSuccess } = useQuery(
"detail/getRevGeo",
// μ€νν μ½λ, (μλ§λ μ’νκ°μ μ μ‘νμ¬ νμ μ μ§μμ΄λ¦μ 리ν΄νλ μ½λ)
GetRevGeocode({ lat: postData?.latitude!, lng: postData?.longitude! }),
{
//qurey option μμΉ, μ λ§ μλμμ΄ λ§μμ λ°λ‘ λ§ν¬ λ¨κΈ°κ² μ΅λλ€.
//μ¬μλ νμ μ μΈ
retry: 1,
}
);
const { status, data } = useQuery(
['quizDetail'],
() => getQuizDetail(quizId),
{
onSuccess: (res) => {
// μ΄λ€ λμλ€
},
onError: () => {
toast.error('μ μ μλ μ€λ₯κ° λ°μνμμ΅λλ€.');
},
}
);
νλ²μ 무ν μ€ν¬λ‘€μ ꡬνν΄λ³Έ κ²½νμ΄ μμ΅λλ€. μ λ§ λ§μ μ€νμμ€μ λΌμ΄λΈλ¬λ¦¬, λΈλ‘κ·Έ λ±μ μ°Ύμ 겨μ°κ²¨μ° μμ±νλ κΈ°μ΅μ΄ λλ€μ. RQμμλ μ κ³Όκ±° κ²½νμ΄ λ¬΄μν μ λλ‘ μμ£Ό κ°λ¨νκ² λ¬΄ν μ€ν¬λ‘€μ ꡬνν μ μμ΅λλ€.
κΈ°λ³Έμ μΌλ‘ νμ΄μ§ λ¨μλ‘ νΉμ λ¨μ index λ§λ€ fetchλ₯Ό μ€ννκ³ hasNextPage
, fetchNextPage()
λ±μΌλ‘ νμ΄μ§μ κ΄λ¦¬ν μ μμ΅λλ€.
useInfiniteQuery
λ useQuery
μ μ μ¬ν©λλ€. λͺλͺ μμλ€μ΄ μΆκ°λμμ΅λλ€.
result
= useInfiniteQuery(μ λν¬ μΈλ±μ€
, ν¨μ
);
μ‘°κΈ μ§μ λΆνμ§λ§ μ°Έκ³ κ° λ κΉλ΄, λΆλλ¬μ΄ μ½λλ₯Ό 첨λΆν©λλ€. π₯²
const {
data: myData,
isFetching: myIsFetching,
isSuccess: myIsSuccess,
// λ€μ νμ΄μ§λ₯Ό λΆλ¬μ¬
fetchNextPage: myfetchNextPage,
hasNextPage: myHasNextPage,
} = useInfiniteQuery(
["mypage/mypost"],
({ pageParam = 0 }) => GetPostMine({ idx: pageParam }),
{
retry: 3,
getNextPageParam: (lastPage, allPages) => {
if (
//μ νκ²½μμμ 쑰건 (κ°μΈ νκ²½μ λ§κ² μμ )
lastPage[lastPage.length - 1]?.statusCode === 500 ||
allPages.flat().length !== 15
)
return null;
return Math.floor((1 + allPages.flat().length) / 15);
},
onSuccess(data) {
console.log(data);
},
}
);
useInfiniteQuery()μ λ‘μ§μ λ€μκ³Ό κ°μ΅λλ€. νμ§λ§ μ΄λ€ μν©μμ ν¨μκ° μ€νλμΌ νλμ§ κΆκΈνμ€κ² κ°μ μΆκ°ν©λλ€.
νΉμ DOM κ°μ²΄λ₯Ό refλ‘ μ§μ ν©λλ€.
const [ref, inView] = useInView();
μ§μ ν refκ° μ¬μ©μμ λΈλΌμ°μ μ 보μ΄κ±°λ λ€μ νμ΄μ§κ° μμΌλ©΄
myfetchNextPage()
λ₯Ό μ€νν©λλ€.useEffect(() => { if (inView && myHasNextPage) myfetchNextPage(); });
μ¬μ©λ ref DOM κ°μ²΄
<div style={{ width: "100vw", height: "5rem" }} ref={ref}></div>
GETμ μ¬μ©νμ¬ λ¨μν μ‘°νλ₯Ό νλ useQueryμ λ¬λ¦¬ λ°μ΄ν°λ₯Ό POST, PUT, DELETEλ₯Ό μ¬μ©νλ λ± ( μμ±
, μ
λ°μ΄νΈ
, μμ
) μλ²λ‘λΆν° λ°μ΄λ² λ³κ²½ μμ²λ€μ mutatationμ μ¬μ©ν΄μΌ ν©λλ€.
mutation
= useMutation(ν¨μ
, {opt
});
//putPost: μμ μ λ¨λ
μ μΌλ‘ μννλ ν¨μ
const { mutate } = useMutation(PutPost, {
onMutate: (data) => {
//μμ μ
setSubmitLoding(true);
},
onError: (error: Error) => {
setError(error.message);
},
onSettled: () => {
//μ’
λ£ μ
setSubmitLoding(false);
},
});
useQuery λ±κ³Ό λμΌνμ§λ§mutation.*
μΌλ‘ .mute
, .isLoading
... λ±μΌλ‘ μ κ·Όν μ μμ΅λλ€.
react queryμλ μ λ§ λ€μν κΈ°λ₯μ μ΅μ λ€μ΄ μμ΅λλ€.
retry
λ‘ refetch μ€μ μ μΈν
ν μ μκ³ , enabled
λ₯Ό ν΅ν΄ μ‘°κ±΄λΆ μ€νμ ν μ μλ λ± μ μ©ν κΈ°λ₯λ€μ΄ λ§μ΄ μμ΅λλ€.