-
[Vue.js] Vue 컴포넌트 데이터 주고 받기Vue 2019. 1. 14. 00:52
"vue 프레임워크의 기본적인 데이터 전달 방식은 상위-하위간 데이터 전달이다."
기본 방식은 아래와 같다
상위 -> 하위 (props 전달)
하위 -> 상위 (이벤트 전달)
각각 컴포넌트들은 고유한 유효범위를 가지고 있어 직접 다른 컴포넌트 값을 참조 할 수 없음
아래코드 참고 ㅎㅎ
123456789101112131415161718192021222324252627282930313233343536373839404142434445<!DOCTYPE html><html lang="en" dir="ltr"><head><meta charset="utf-8"><script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js" ></script><title></title></head><body>컴포넌트 간의 통신!<div id="app1"><local-component1></local-component1><local-component2></local-component2></div><script>var obj1 = {template : '<div> 첫번째 지역 컴포넌트: {{result}} </div>',data : function(){return {result : 12345}}};var obj2 ={template : '<div> 두번째 지역 컴포넌트: {{result}} </div>',data : function(){return {result : obj1.data.result // obj1 컴포넌트 값에 접근 불가!}}};new Vue({el : '#app1',components : {'local-component1' : obj1,'local-component2' : obj2}});</script></body></html>cs 결과화면
상위에서 하위로 데이터 전달하기
123456789101112131415161718192021222324252627282930<!DOCTYPE html><html lang="en" dir="ltr"><head><meta charset="utf-8"><script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js" ></script><title></title></head><body><b>상위에서 하위 컴포넌트로 데이터 전달 하기!</b><div id="app1"><child-component v-bind:pdata="message"></child-component></div><script>Vue.component('child-component',{props : ['pdata'],template : '<div> {{pdata}} </div>'});new Vue({el : '#app1',data : {message : '아들아 받아라'}});</script></body></html>cs 11행의 v-bind : pdata 이렇게 띄어 쓰기하면 에러남.. 삽질했다... v-bind쓰고 꼭 붙여 쓰자
결과화면
하위에서 상위로 이벤트 전달하기
하위에서 상위 컴포넌트로 데이터 전달 할 수 있는 방법은 있다
이벤트 버스를 이용하면된다. 하지만 vue의 단방향 데이터 흐름에 어긎나는 구현 방법이다.
일단 여기까지만 알아두고
이벤트 발생은 $emit()
이벤트 수신은 v-on: 속성을 사용해 구현 한다
1234567891011121314151617181920212223242526272829303132333435363738<!DOCTYPE html><html lang="en" dir="ltr"><head><meta charset="utf-8"><script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js" ></script><title></title></head><body><b>하위에서 상위 컴포넌트로 이벤트 전달 하기!</b><div id="app1"><!-- child-event는 하위 컴포넌트의 이벤트명 --><!-- printText는 상위 컴포넌트의 메서드명 --><child-component v-on:child-event="patentReceive"></child-component></div><script>Vue.component('child-component',{template : '<button v-on:click="sendEvent"> 버튼 </button>',methods:{sendEvent : function(){this.$emit('child-event'); // 이벤트 발생 로직}}});new Vue({el : '#app1',methods : {patentReceive : function() {alert('받았다요~');}}});</script></body></html>cs 결과화면
관계없는 컴포넌트간의 통신 (이벤트버스)
이벤트버스 : 지정한 2개의 컴포넌트간에 데이터를 주고받을 수 있는 방법
이벤트버스를 이용하면 상위-하위 관계 유지하지 않아도 데이터를 주고 받을 수 있음.
보내는 컴포넌트에서는 .$emit()
받는 컴포넌트에서는 .$on()을 구현한다
1234567891011121314151617181920212223242526272829303132333435<!DOCTYPE html><html lang="en" dir="ltr"><head><meta charset="utf-8"><script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js" ></script><title></title></head><body><b>이벤트버스 테스트!~</b><div id="app1"><child-component></child-component></div><script>//전역 컴포넌트 생성var eventBus = new Vue();Vue.component('child-component',{template : '<div> 하위 컴포넌트 영역 <button v-on:click="sendMessage"> 이벤트 전송 버튼</button> </div>',methods : {sendMessage : function(){eventBus.$emit('sendEventName', 100000000000); // 이벤트를 보내는 컴포넌트}}});var app = new Vue({el : '#app1',created : function(){ // create 라이프 사이클 훅eventBus.$on('sendEventName', function(value){ // 이벤트를 받은 컴포넌트alert('전달받은 데이터:'+ value);});}});</script></body></html>cs 단점
너무 많이쓰면 관리가 힘듬. 이 문제는 Vuex라는 상태관리도구로 해결 할 수 있다.
아직 패턴이 익숙하지않아서 낯설다.. 역시 타이핑을 많이 해봐야 익숙할 듯하다..
'Vue' 카테고리의 다른 글
[Vue.js] 네임드뷰 (0) 2019.01.21 [Vue.js] Vue 라우터란? (2) 2019.01.20 [Vue.js] Vue 인스턴스의 라이프 사이클 (0) 2019.01.13 [Vue.js] Vue 컴포넌트란? (0) 2019.01.13 [Vue.js] Vue.js란? (0) 2018.12.05