νμ¬ νμ¬μμλ react-query
λ₯Ό μνκ΄λ¦¬ λ° μΊμκ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ‘ μ¬μ©νκ³ μλ€. μ¬μ€ μ¬μ©νκ³ μλ λ²μ μ v4λ‘, μμΌλ‘ μΈκΈν onSuccess
λ₯Ό ν¬ν¨ν onError
, onSettled
λ₯Ό μ¬μ©ν μ μλ€.
νμ§λ§ μΈμ κ°λ λ²μ μ
μ ν ν
λ μ΅λν μ μ§λ³΄μ λΉμ©μ΄ λ€μ§μκ² ν΄λΉ μ΅μ
μ μ¬μ©νμ§ μλ λ°©ν₯μΌλ‘ μ½λλ₯Ό λ§λ€κ³ μλ€. νμ§λ§ μ²μμ onSuccess
λ₯Ό μ΄λ»κ² λ체ν΄μΌν μ§ λ¨Έλ¦Ώμμμ κ·Έλ¦Όμ΄ κ·Έλ €μ§μ§ μμλ€. κ·Έλμ μ΄λ€ λ체ν μ μλ λ°©λ²μ΄ μμμ§ νλμ© μ΄ν΄λ³΄λ €κ³ νλ€.
νν©
v5
λ²μ μ doc
λ₯Ό 보면 λ€μ λ§ν¬μμ onSuccess
, onError
, onSettled
κ° μμ λμλ€κ³ λͺ
μν΄μ£Όκ³ μλ€. λ¬Όλ‘ queries
μμλ§μ΄κ³ , mutation
μμλ μ μ§λλ€. μ¬μ§μ΄ μ΄λ€ κ°λ°μλ ν΄λΉ ν¨μλ€μ bad api λΌκ³ μΉνκΈ°λ νλ€!
ν΄λΉ μ΅μ
μ κ΅μ₯ν νΈλ¦¬ν κΈ°λ₯μ΄μκ³ , λ§μ κ°λ°μλ€μ΄ ν΄λΉ μ΅μ
μ μ¬μ©ν΄μ μ½λλ₯Ό μμ±νμκ±°λΌκ³ λ³Έλ€. μλ§ μ΄ λ³κ²½μ¬νμ΄ νμ¬κΉμ§ react-query
μ
λ°μ΄νΈ μ€ κ°μ₯ ν° breaking change
κ° μλκΉ μΆλ€. μκ°ν΄λ³΄λ©΄ μ§κΈκΉμ§ μ무 λ¬Έμ μμ΄ μλμκ°λ κΈ°λ₯μ΄ μ¬λΌμ§κ² λκ²μ΄λ€. (μμλ§ν΄λ λ§λ§νλ€...λμ°ν΄..)
λνμ μΌλ‘ onSuccess
λ₯Ό μ¬μ©νλ μμλ₯Ό 보μ.
export function useTodos() {
const [todoCount, setTodoCount] = React.useState(0);
const { data: todos } = useQuery({
queryKey: ['todos', 'list'],
queryFn: fetchTodos,
//π Don't do this!
onSuccess: (data) => {
setTodoCount(data.length)
},
});
return { todos, todoCount };
}
μ λ° κ΅¬μ‘°λ λ€μκ³Ό κ°μ λ¬Έμ λ₯Ό μΌκΈ°ν μ μλ€.
useState
μsetState
ν¨μλ λ λ€λ₯Έ λ λλ§μ μ λ°νλ€ (μ΄κ²μ μλͺ νλ€)staletime
μμ νΈμΆμΌ κ²½μ° μΊμμμ λ°μ΄ν°λ₯Ό μ½μ΄μμλ λ¬Έμ κ° λ°μν μ μλ€ (fetch
κ° λ°μν΄μΌonSuccess
κ° νΈμΆλλλ° μΊμλ₯Ό μ½μ΄μ¬κ²½μ°refetch
κ° λ°μνμ§ μλλ€)onSuccess
λquery
κ° μ±κ³΅νλ©΄ λ°λ‘ μ€νλκΈ° λλ¬ΈμuseEffect
μ²λΌ λ λλ§μ΄ λλλ€ μ€νλμ§ μλλ€. μ΄λ λ€μλ§νλ©΄ λ λλ§ νμλ νλ©΄μ΄ μ΅μ λ°μ΄ν°λ‘ μ λ°μ΄νΈ λμ§ μμμκ° μλ κ²μ΄λ€.
μ΄λ»κ² λ체ν μ μμκΉ
νμ§λ§ μ½λλ₯Ό μ§λ€λ³΄λ©΄ λΆλͺ ν (μλλ©΄ 무쑰건) onSuccess μ λ‘μ§μ΄ νμν κ²½μ°κ° μλ€. κ·Έλ°κ²½μ° μ¬μ©ν μ μλ λ°©λ² λͺκ°μ§λ₯Ό μμ보μ.
1) useEffect μ μ¬μ©
μλ μ½λλ₯Ό 보면 μ μλΏμκ²μ΄λ€. response
λ₯Ό watch
ν΄μ λμνλλ‘ νλ λ°©λ²μ΄λ€.
export function useTodos(filters) {
const [todoCount, setTodoCount] = React.useState(0);
const { data: todos } = useQuery({
queryKey: ['todos', 'list'],
queryFn: fetchTodos,
});
React.useEffect(() => {
if (todos) {
setTodoCount(todos.length);
}
}, [todos]);
}
2) λΆνμν state μ¬μ©νμ§ μκΈ°
μμμ μΈκΈν λ¬Έμ μ μ€ 3λ² λ¬Έμ μ (λ λλ§μ΄νμλ λ°μ΄ν°κ° λκΈ°ν λμ§ μλμ΄μ)μ ν΄κ²°νκΈ° μν΄μλ useState
λ₯Ό νμ©νμ§ μκ³ λ°λ‘ data
λ₯Ό μ¬μ©ν΄μ λ°μ΄ν°λ₯Ό λκΈ°ν μν¬μ μλ€.
export function useTodos() {
const { data: todos } = useQuery({
queryKey: ['todos', 'list'],
queryFn: fetchTodos,
});
const todoCount = todos?.length ?? 0; // μμ μμμμμ²λΌ todo count λ₯Ό μ¬μ©νμ§ μλλ€
return { todos, todoCount };
}
3) select νμ©
1μ μμ μμ μ²λΌ todosλ₯Ό watch νλ λ°©λ²μ²λΌ select
λ₯Ό μ¬μ©ν μλ μλ€. select
λ νμ return dataκ° μμλ λμνκΈ° λλ¬Έμ΄λ€.
export function useTodos() {
const { data: todoCounts } = useQuery({
queryKey: ['todos', 'list'],
queryFn: fetchTodos,
select: (data) => data.length
});
return { todoCounts };
}
- https://tanstack.com/query/latest/docs/framework/react/guides/migrating-to-react-query-4#onsuccess-is-no-longer-called-from-setquerydata - https://tkdodo.eu/blog/breaking-react-querys-api-on-purpose