νμ¬ νμ¬μμλ 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