vue.js emit이란, vue에서 emit이란? emit이란 영어로 방출하다라는 뜻을 가졌습니다. vue.js에서 emit이란 $emit 함수를 의미합니다. $emit함수는 child component에서 parent component로 communication할 수 있도록, 임의의 이벤트를 발생시켜주는 vue의 build-in 함수입니다.
이를 도식화하면 아래와 같습니다. $emit의 첫번째 매개변수는 event/함수명이고, 그 뒤에는 가변 인자입니다.
@startuml
node ParentComponent{
} node ChildComponent{
} ChildComponent -> ParentComponent: $emit(‘event명’, 인자1, 인자2, …)
@enduml
$emit 사용법, $emit 예제코드 아래는 ChildComponent에서 eventFromChild(event-from-child) 란 이벤트를, 문자열 인자와 함께 발생시켜 ParentComponent에서 function을 수행하게 하는 예제 코드입니다.
ChildComponent 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <template > <button @click ="clickOnChild" > click on child</button > </template > <script > export default { setup (props, ctx ){ const clickOnChild = ( )=>{ ctx.emit ('eventFromChild' , 'child msg' ); }; return { clickOnChild } } } </script >
ParentComponent 1 2 3 4 5 6 7 8 9 10 11 12 13 <template > parent에서의 값 : {{data}} <ChildComponent @event-from-child ="change" /> </template > <script setup > import {ref} from 'vue' import ChildComponent from './ChildComponent.vue' const data = ref ('' );const change = (msg ) => { data.value = msg; }; </script >
실행시켜보면, ChildComponent쪽의 버튼을 클릭하면, Parent에 있는 msg값이 변경되는것을 확인할 수 있습니다.
emit 여러개 인자 $emit에서 여러개의 인자를 사용하려면, 아래 예제코드와 같이 단순히 event 뒤에 parameter를 ,로 이어 붙여서 작성하면 됩니다. 아래 예제코드는 인자를 두개 받는 예제이며, $emit(‘eventFromChild’, ‘msg’, ‘msg2’, ‘msg3’); 과 같이 세 개 이상도 가능합니다. 이것은 $emit이 가변인자 함수로, 개발자가 몇개의 인자를 넘기든 동작하도록 구현되어 있기 때문입니다.
ChildComponent 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <template > <button @click ="clickOnChild" > click on child</button > </template > <script > export default { setup (props, ctx ){ const clickOnChild = ( )=>{ ctx.emit ('eventFromChild' , 'child msg' , 'test' ); }; return { clickOnChild } } } </script >
ParentComponent 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <template > parent에서의 값 : {{data}} {{data2}} <ChildComponent @event-from-child ="change" /> </template > <script setup > import {ref} from 'vue' import ChildComponent from './ChildComponent.vue' const data = ref ('' );const data2 = ref ('' );const change = (msg, msg2 ) => { data.value = msg; data2.value = msg2; }; </script >
emit 여러개 이벤트 $emit에서 여러개 이벤트를 전달하려면 어떻게 해야할지에 대한 예제코드는 다음과 같습니다.
ChildComponent 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <template > <button @click ="clickOnChild" > click on child</button > </template > <script > export default { setup (props, ctx ){ const clickOnChild = ( )=>{ ctx.emit ('event1' , 'msg1' ); ctx.emit ('event2' , 'msg2' ); ctx.emit ('event3' , 'msg3' ); }; return { clickOnChild } } } </script >
ParentComponent 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <template > parent에서의 값 : {{msg}} {{msg2}} {{msg3}} <ChildComponent @event1 ="(msg) => msg.value=msg;" @event2 ="(msg) => msg2.value=msg;" @event3 ="(msg) => msg3.value=msg;" /> </template > <script setup > import {ref} from 'vue' import ChildComponent from './ChildComponent.vue' const msg = ref ('' );const msg2 = ref ('' );const msg3 = ref ('' );</script >
defineEmits defineEmits 는 <script setup>.
에서 emit가능한 함수명을 정의할 수 있게 해주는 vue 내장 api 입니다.
defineEmits api에 대한 코드는 아래 예제 코드와 같이 사용할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <template > parent에서의 값 : {{msg1}} {{msg2}} {{msg3}} <ChildComponent @event1 ="(msg) => msg1=msg" @event2 ="(msg) => msg2=msg" @event3 ="(msg) => msg3=msg" /> </template > <script setup > import {ref} from 'vue' import ChildComponent from './components/ChildComponent.vue' const msg1 = ref ('' );const msg2 = ref ('' );const msg3 = ref ('' );</script >
위 코드는 export default를 사용하는 아래코드와 동일합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <template > <button @click ="clickOnChild" > click on child</button > </template > <script > export default { setup (props, ctx ){ const clickOnChild = ( )=>{ ctx.emit ('event1' , 'msg1' ); ctx.emit ('event2' , 'msg2' ); ctx.emit ('event3' , 'msg3' ); }; } } </script >