한 페이지 내에 여러 component로 구분이 되어있음
-> 근데 한 페이지 내에서 같은 데이터를 공유 해야 함
Child component에도 똑같은 data를 정의한다고 해서 그 부모 component의 data 가 변경된다고 Child component의 data도 변경되지 않는다
-> 각 component는 독립적이기 때문 !
pass props & emit event
pass props
props in HelloWorld
사실, 우리의 Vue app은 이미 props를 사용하고 있었다!
Vue CLI를 설치할 때 만들어주었던 App.vue의 HelloWorld 컴포넌트를 살펴보면 msg라는 property가 작성되어있음
HelloWorld.vue에서
msg를 사용한 것을 확인할 수 있음
App.vue에서 property로 넘긴
msg가 출력되는 것을 확인할 수 있음
props in HelloWorld 정리
msg="~"
라는 property를 설정하였고,{{ msg }}
의 형태로 사용한 것Pass Props
prop-data-name="value"
의 형태로 데이터를 전달Pass Props convention
부모에서 넘겨주는 props
자식에서 받는 props
부모 템플릿(html)에서 kebab-case로 넘긴 변수를 자식의 스크립트(vue)에서 자동으로 camelCase로 변환하여 인식
Dynamic props
Dynamic props 실습
컴포넌트의 data 함수
data : function () {
return {
// component's data here
}
}
Pass props
:dynamic-props="dynamicProps"
:my-props="dynamicProps"
로 데이터를 넘긴다면,//1
<SomeComponent num-props="1"/>
//2
<SomeComponent :num-props="1">
단방향 데이터 흐름
모든 props는 부모에서 자식으로 즉 아래로 단방향 바인딩을 형성
부모 속성이 업데이트되면 자식으로 흐르지만 반대 방향은 아님
목적
하위 컴포넌트에서 prop를 변경하려고 시도해서는 안되며
그렇게 하면 Vue는 콘솔에서 경고를 출력함
부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달할 때는 이벤트를 발생시킴
이벤트를 발생시키는 게 어떻게 데이터를 전달하는 것이냐?
$emit
$emit 메서드를 통해 부모 컴포넌트에 이벤트를 발생
Semit('event-name')
형식으로 사용하며 부모 컴포넌트에event-name
이라는 이벤트가 발생했다는 것을 알림$emit('event-name')
가 실행되면 event-name
이벤트가 발생하는 것참고) $
Emit Event
$emit
을 통해 부모 컴포넌트에게 child-to-parent 이벤트를 트리거 Emit Event 흐름 정리
자식 컴포넌트에 있는 버튼 클릭 이벤트를 청취하여
연결된 핸들러 함수(ChildToParent) 호출
호출된 함수에서 $emit을 통해 상위 컴포넌트에 이벤트(child-to-parent) 발생
상위 컴포넌트는 자식 컴포넌트가 발생시킨 이벤트(child-to-parent)를 청취하여
연결된 핸들러 함수(parentGetEvent) 호출
emit with data
emit with data 흐름 정리
자식 컴포넌트에 있는 버튼 클릭 이벤트를 청취하여
연결된 핸들러 함수(ChildToParent) 호출
호출된 함수에서 $emit을 통해 부모 컴포넌트에 이벤트(child-to-parent)를 발생
부모 컴포넌트는 자식 컴포넌트의 이벤트 (child-to-parent)를 청취하여
연결된 핸들러 함수(parentGetEvent) 호출,
함수의 인자로 전달된 데이터(child data)가 포함되어 있음
호출된 함수에서 console.log(~child data~) 실행
emit with dynamic data
emit with dynamic data 흐름 정리
자식 컴포넌트에 있는 keyup.enter 이벤트를 청취하여
연결된 핸들러 함수(ChildInput) 호출
호출된 함수에서 $emit을 통해 부모 컴포넌트에 이벤트(child-input)를 발생
이벤트에 v-model로 바인딩 된 입력받은 데이터를 전달
상위 컴포넌트는 자식 컴포넌트의 이벤트(child-input)를 청취하여
연결된 핸들러 함수(getDynamicData) 호출,
함수의 인자로 전달된 데이터가 포함되어 있음
호출된 함수에서 console.log(~입력받은 데이터~) 실행
정리
pass props/emit event
부모 -> 자식 -> 손자 -> 손자 자식 -> ,,,
: prop
자식의 자식의 자식 -> 자식의 자식 -> 자식 -> 부모
: emit
아니 그래서 언제는 kebab-case고 언제는 camel Case야?
-> HTML 요소에서 사용할 때는 kebab-case
-> JavaScript에서 사용할 때는 camel Case
props
emit