부모컴포넌트에서 자식컴포넌트로 이벤트를 보낼 일이 있어 eventbus를 사용하려는데, vue3에서는 사용하지 말라고 되어있어 어떤 방법을 써야하나 찾아봤더니 mitt 이라는걸 다운받아서 emitter 로 선언하여 사용하는 방법이 가장 많았다.
동작방법
1. store에 emitter선언해서 어느 컴포넌트간에 접근할 수 있도록 한다.
2. eventbus와 동일하게 보내는곳에서 emit / 받는 곳에서 on 으로 처리한다.
Vue3
1. mitt 다운로드
npm i mitt
2. store의 state에 emitter 선언
import mitt from 'mitt'; //mitt 가져오기
export default createStore({
state: {
emitter: mitt(), //emitter 선언
}
});
3. 이벤트 보낼 부모 컴포넌트
import { useStore } from "vuex"; //store 가져오기
export default {
setup() {
const store = useStore(); //store 선언
const { emitter } = store.state; //state 안에 있는 emitter 접근
const showListLayer = () => {
emitter.emit('send-event', "부모컴포넌트에서 왔습니다.");
}
return {
showListLayer
}
}
}
4. 이벤트 받을 자식 컴포넌트
import { useStore } from "vuex"; //store 가져오기
export default {
setup() {
const store = useStore(); //store 선언
const { emitter } = store.state; //state 안에 있는 emitter 접근
emitter.on('send-event', (e) => {
alert(e); //부모컴포넌트에서 보낸 데이터입니다. alert
})
return {
}
}
}
Vue2 (vue2에서 내가 일반적으로 했던 방법)
1. utils 폴더에 eventbus.js 라는 파일 만들기
import Vue from "vue";
export const eventBus = new Vue(); //이벤트 태울 버스 생성
2. 이벤트 보낼 부모 컴포넌트
import { eventBus } from './utils/eventBus'
export default {
methods: {
showListLayer() {
eventBus.$emit('send-event', "부모컴포넌트에서 왔습니다.");
}
}
}
3. 이벤트 받을 자식 컴포넌트
import { eventBus } from './utils/eventBus'
export default {
created() {
eventBus.$on('send-event', this.getEvent)
},
methods: {
getEvent(e) {
alert(e); //부모컴포넌트에서 보낸 데이터입니다. alert
}
}
}
반응형
'Vue > Vue3' 카테고리의 다른 글
[Vue3 & typescript] component의 composables/ts 로 emit과 props 보내기 (0) | 2022.01.12 |
---|---|
[Vue3] vue에서 전체선택 체크박스 로직 구현하기 (checkbox select all) (0) | 2022.01.03 |
[Vue2 vs Vue3] vue에 있는 ref 접근하기 ! this.$ref 사용하기 (template refs) (0) | 2021.12.07 |
[Vue.config.js & SCSS] Vue2 / Vue3 에서 global scss 연결하기 (0) | 2021.12.06 |
[Vue2 vs Vue3] 기본내용정리 3 (computed와 methods) (0) | 2021.12.06 |