vue
[Vue] 데이터 전송 방법: props&emit, Mitt, Vuex
yjenis
2024. 6. 25. 18:02

1. A, B는 자식이고 같은 부모가 있음
2. A- >B로 데이터를 전송
2-1) A compenent에서 0 또는 1 버튼을 누르면 결과가 B Component 에서 표시되도록 하기
1.props&emit
A.vue
<template>
<div>
<button @click="buttonClick('0')">0</button>
<button @click="buttonClick('1')">1</button>
</div>
</template>
<!-- a에서 emit으로 parent에 보내면 b로 props -->
<script setup>
import { defineEmits } from 'vue';
import eventBus from '../eventBus'
// emit 선언
const emit=defineEmits(['oxEvent'])
// 버튼 누르면 emit 실행
const buttonClick= function(result){
emit('oxEvent',result)
}
</script>
Parent.vue
<template>
<!-- <p>Parent</p> -->
<!-- <p>{{result}}</p> -->
<A @ox-event="handleOxEvent"/>
<B :result="result"/>
</template>
<script setup>
import {ref} from 'vue';
import A from './A.vue';
import B from './B.vue';
const result=ref('')
const handleOxEvent = function(newResult){
result.value=newResult;
}
</script>
B.vue
<template>
{{ result }}
</template>
<script setup>
defineProps(['result'])
// defineProps({
// result:Number
// })
</script>
2.Mitt
1. mitt 설치
npm install mitt
2. 이벤트버스 설정
// src/eventBus.js
import mitt from 'mitt';
const eventBus = mitt();
export default eventBus;
A.vue
<template>
<div>
<button @click="buttonClick('0')">0</button>
<button @click="buttonClick('1')">1</button>
</div>
</template>
<!-- a에서 emit으로 parent에 보내면 b로 props -->
<script setup>
import { defineEmits } from 'vue';
import eventBus from '../eventBus'
// emit 선언
// const emit=defineEmits(['oxEvent'])
// 버튼 누르면 emit 실행
const buttonClick= function(result){
eventBus.emit('oxEvent',result)
}
</script>
Parent.vue
<template>
<MittA/>
<MittB :result="result"/>
</template>
<script setup>
import {ref, onMounted, onUnmounted} from 'vue';
import MittA from './MittA.vue';
import MittB from './MittB.vue';
import eventBus from '../eventBus';
const result=ref('')
const handleOxEvent = function(newResult){
result.value=newResult;
}
onMounted(() => {
eventBus.on('oxEvent', handleOxEvent);
});
onUnmounted(() => {
eventBus.off('oxEvent', handleOxEvent);
});
</script>
B.vue
<template>
<div>{{ result }}</div>
</template>
<script setup>
defineProps(['result'])
// defineProps({
// result:Number
// })
</script>
3. Vuex
1. Vuex 설치
npm install vuex@next
2. Vuex 저장소 설정
프로젝트 루트에 store.js 파일을 생성하고 Vuex 저장소를 설정
// src/store.js
import { createStore } from 'vuex';
const store = createStore({
state() {
return {
result: ''
};
},
mutations: {
setResult(state, newResult) {
state.result = newResult;
}
},
actions: {
updateResult({ commit }, newResult) {
commit('setResult', newResult);
}
},
getters: {
getResult(state) {
return state.result;
}
}
});
export default store;
3. main.js
Vue 애플리케이션에 Vuex 저장소 추가
import './assets/main.css'
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
import mitt from 'mitt'
import store from './stores/store'
const app = createApp(App)
const emitter=mitt();
app.config.globalProperties.emitter=emitter
app.use(createPinia())
app.use(router)
app.use(store);
app.mount('#app')
A.vue
<template>
<div>
<button @click="buttonClick('0')">0</button>
<button @click="buttonClick('1')">1</button>
</div>
</template>
<script setup>
import { useStore } from 'vuex';
const store = useStore();
const buttonClick = (result) => {
store.dispatch('updateResult', result);
};
</script>
Parent.vue
<template>
<div>
<XA />
<XB :result="result" />
</div>
</template>
<script setup>
import { computed } from 'vue';
import { useStore } from 'vuex';
import XA from './XA.vue';
import XB from './XB.vue';
const store = useStore();
const result = computed(() => store.getters.getResult);
</script>
B.vue
<template>
<div>{{ result }}</div>
</template>
<script setup>
const props = defineProps({
result: {
type: String,
required: true
}
});
</script>