: 상위 -> 하위 컴포넌트 데이터 전달
<!--템플릿-->
<span :props="name"> {{ name }} </span>
// 스크립트
props: {
name: {
type: String,
...
},
...
<table :name="someName"></table>
: 하위 -> 상위 컴포넌트 데이터 전달
<!--템플릿-->
<button @click="changeCnt" > {{ cnt }} </span>
// 스크립트
changeCnt() {
this.$emit("change-cnt", val);
<!--템플릿-->
<table @change-cnt="changeCnt"></table>
// script
changeCnt() {
this.prCnt = ...;
}
-> props로 하위 컴포넌트에 데이터 전달
-> emit을 통해 데이터를 넘겨주고 상위 컴포넌트에서 값 수정
: 부모-자식 컴포넌트가 아닌 관계의 컴포넌트끼리 데이터 통신
Root Instance (main.js)
└─ 최상위 컴포넌트 (App.vue)
├─ Component A
├─ Component B
└─ Component C
└─ Component D
-> 컴포넌트 C & D 사이에 데이터 통신이 필요
! props & emit : C -> B -> A -> D
-> 상태 변경 복잡성 증가 : 어플리케이션이 복잡해지면 유지보수 매우 힘들다
-> event bus 사용
// main.js에 event bus 등록
export const eventBus = new Vue()
<template>
<div> {{ this.textComponentD }}
<button @click="clickComponentDButton">
{{ this.ComponentDBtnVaule }}
</button>
</div>
</template>
<script>
import { eventBus } from "@/main.js";
export default {
name: "ComponentD",
data: function () {
return {
textComponentD: "ComponentD 입니다.",
ComponentDBtnVaule: "D의 버튼",
};
},
created() {
eventBus.$on("clickComponentCButton", (componentCButtonValue) => {
window.alert(componentCButtonValue);
});
},
beforeDestroy() {
eventBus.$off("clickComponentCButton");
},
methods: {
clickComponentDButton() {
eventBus.$emit("clickComponentDButton", this.ComponentDBtnVaule);
},
},
};
</script>
: 사용할 모든 component에서 listener 등록과 제거 필요
: 가독성이 낮고 데이터 흐름을 파악하기 어려워 유지보수가 힘들다
: 상태 관리를 위한 패턴이자 라이브러리
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
exampleData1: '',
exampleData2: '',
}
})
// state 직접 사용
//component C
<script>
...
this.$store.state.exampleData1 = "example 1";
this.exampleData2 = this.$store.state.exampleData2;
</script>
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
exampleData1: '',
exampleData2: '',
},
mutations: {
set_exampleData1(state, value) {
state.exampleData1 = value;
},
}
})
// component C
<script>
...
this.$store.commit('set_exampleData1', "테스트 데이터");
...
</script>
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
exampleData1: '',
exampleData2: '',
},
mutations: {
set_exampleData1(state, value) {
state.exampleData1 = value;
},
},
actions : {
setExample1({commit}, value) {
commit('set_exampleData1', value);
},
}
})
// component C
<script>
...
this.$store.dispatch('setExample1', "테스트 데이터").then(() => {
...다음 작업...
})
...
</script>