vue3 개발자였던 내가 보기 위해 비슷한 리엑트 훅 정리

윤여찬's avatar
Jan 02, 2026
vue3 개발자였던 내가 보기 위해 비슷한 리엑트 훅 정리
React
VueUse / Vue
useState
ref
useEffect
watch / onMounted
useMemo
computed
useCallback
computed(fn)
useRef
ref
useContext
provide/inject
useQuery
useAsyncState + watch + store
useMutation
직접 함수 + 상태

useState → ref (가장 정확한 대응)

React

const [count, setCount] =useState(0);

Vue 3

const count =ref(0);

개념 대응

  • 변경되면 리렌더 트리거
  • 값 보관용
  • 자동 추적은 아님(직접 set 호출)
useState = ref + setter
Vue의 ref.value =
React는 setState()로 강제한 구조

useEffect → watch + onMounted (조건에 따라)

React

useEffect(() => { fetchData(); }, []);

Vue

onMounted(() => { fetchData(); });

React

useEffect(() => { fetchData(id); }, [id]);

Vue

watch(id,() => { fetchData(id); }, {immediate:true });

개념 대응

  • []onMounted
  • [id]watch(id)
  • cleanup → onUnmounted / watch return
useEffect는 watch + lifecycle을 합쳐놓은 훅

useMemo → computed (의미상 거의 동일)

React

const total =useMemo(() => price * count, [price, count]);

Vue

const total =computed(() => price.value * count.value);

차이

  • Vue: 자동 의존성 추적
  • React: 의존성 배열 수동 선언
개념은 동일, React가 더 수동적

useCallback → “함수용 computed”

React

const onClick =useCallback(() => { doSomething(id); }, [id]);

Vue

const onClick =computed(() =>() => { doSomething(id.value); });
또는 보통은 그냥 함수 써도 됨

개념

  • 함수 재생성 방지용
  • React에서만 의미가 큼 (렌더링 특성 때문)
Vue에서는 거의 신경 안 쓰는 영역

useRef → ref (DOM) + “리렌더 안 나는 저장소”

React

const inputRef = useRef<HTMLInputElement>(null);

Vue

const inputRef = ref<HTMLInputElement |null>(null);

또 다른 useRef 용도

const timer = useRef<number |null>(null);
→ Vue에서는 그냥 let timer 해도 됨
useRef = DOM 참조 + 리렌더 안 나는 변수

useContext → provide / inject

React

const theme =useContext(ThemeContext);

Vue

const theme =inject('theme');

개념

  • 전역 의존성 주입
  • prop drilling 회피

useReducer → Pinia / Vuex / reactive 객체

React

const [state, dispatch] =useReducer(reducer, initialState);

Vue

const state =reactive({ ... });
또는 Pinia store
useReducer는 “작은 store”
Vue에서는 보통 Pinia로 승격됨

React Query useQuery →

watch + store + VueUse async 조합

Vue 쪽 감각적 대응

watch( () => id, async () => { data.value =awaitfetchData(id.value); }, {immediate:true } );
  • Pinia 저장
  • 캐싱 직접 구현
useQuery = watch(immediate) + 전역 캐시(store) + fetch 정책

대충 비슷하고 다른 것들을 정리해보았다.
Share article

찬찬잉