Props & Emits: Vue에서의 컴포넌트 커뮤니케이션
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
React 개발자 및 Vue 학습자 (중간 난이도: React의 hooks와 JSX 기반 경험 필요)
핵심 요약
- Vue의
props
와emits
는 부모-자식 커뮤니케이션을 간소화 props
로 데이터 전달,emits
로 이벤트 발생 (React의 callback prop 대체)reactive
및computed
로 상태 변화 추적과 최적화- Vue의 Proxy 기반 반응성 시스템
- 배열 직접 수정 가능 (
slice()
대체) @select
이벤트 핸들러 사용으로 JSX 람다 제거- React와의 핵심 차이점
- React: 불변 상태 업데이트 +
useMemo
사용 - Vue:
computed
로 자동 캐싱 +ref
/reactive
활용
섹션별 세부 요약
1. React의 컴포넌트 커뮤니케이션 패턴
onSelect
콜백 prop 전달 및 클로저 생성- 불변 상태 유지 위해
squares.slice()
사용 useState
+useEffect
로 상태 관리 및 최적화- JSX 내
map
+ 람다 인라인 처리
2. Vue의 `props` 및 `emits` 활용
defineProps
+defineEmits
로 props/이벤트 정의- 자식 컴포넌트에서
@click="select"
로 이벤트 발생 - 부모는
@select="..."
로 이벤트 리스닝 props.value = 'X'
는 Vue에서 경고 발생 (props는 읽기 전용)
3. Vue의 반응성 시스템
reactive(Array(...))
로 배열 감시 (Proxy 기반)squares[i] = 'X'
직접 수정 가능 (React의slice()
대체)ref(xIsNext)
로 플레이어 전환 상태 관리
4. `computed`의 활용
winner
계산 속성:squares
변화 시 자동 재계산winner.value
로 승자 상태 확인{{ winner ? ... : ... }}
템플릿 내 직접 사용
5. 템플릿 구조 비교
- React:
onSelect={() => handleClick(i)}
인라인 람다 - Vue:
@select="() => handleClick(...)"
템플릿 내 이벤트 핸들러 v-for
+:key
로 HTML 중심 템플릿 구조 유지
결론
- Vue의
props
/emits
+reactive
/computed
로 React의 불변 상태 및useMemo
복잡성을 간소화 v-for
+@select
기반 템플릿은 JSX 없이도 직관적 구조 유지- 다음 단계:
watch
vswatchEffect
, 중첩 컴포넌트 상태 관리, 폼 유효성 검증 학습 권장