Vuejs - 컴포넌트

홍예진·2022년 11월 13일
0

Vue.js

목록 보기
4/7

컴포넌트(Component)

  • Vue의 가장 강력한 기능 중 하나
  • HTML Element를 확장하여 재사용 가능한 코드를 캡슐화
  • Vue Component는 Vue Instance이기도 하기 때문에 모든 옵션 객체를 사용
  • Life Cycle Hook 사용 가능
  • 전역/지역 컴포넌트

전역 컴포넌트 등록

  • 전역 컴포넌트를 등록하려면, Vue.component(tagName, options)를 사용
  • 권장하는 컴포넌트 이름 : 케밥 표기법
<div id="app">
  <my-global></my-global>
  <my-global></my-global>
<div>
<script>
	Vue.component('MyGlobal', {
		template: '<h2>전역 컴포넌트임</h2>'
	});
</script>

지역 컴포넌트 등록

  • 컴포넌트를 components 인스턴스 옵션으로 등록함으로써 다른 인스턴스/컴포넌트 범위에서만 사용할 수 있는 컴포넌트를 만들 수 있다.
var Child = {
	template : '<div>사용자 정의 컴포넌트입니다!</div>
}
new Vue({
	components : {
    	'my-component' : Child
    }
})

Component Template

<div id="app">
  <my-comp></my-comp>
</div>
<template id="MyComp">
  <div>
  	<h2>{{msg}}</h2>
  </div>
</template>

<script>
 Vue.component('MyComp', {
 	template: '#MyComp',
    data(){
    	return {
        	msg : 'hello component',
        }
    },
 });
 new Vue({
 	el: '#app',
 });
</script>

컴포넌트 통신

  • 상위(부모)-하위(자식) 컴포넌트 간의 data 전달 방법
  • 부모에서 자식 : props라는 특별한 속성을 전달 (Pass Props)
  • 자식에서 부모 : event로만 전달 가능 (Emit Event)

동적 props

  • v-bind(:)를 사용하여 부모의 데이터에 props를 동적으로 바인딩 할 수 있다
  • 데이터가 상위에서 업데이트 될 때마다 하위 데이터로도 전달된다.
<div>
  <input v-model="parentMsg">
  <child :my-message="parentMsg"></child>
</div>

사용자 정의 이벤트(Custom Events)

  • 이벤트는 자동 대소문자 변환을 제공하지 않는다.
  • v-on 이벤트 리스너는 항상 자동으로 소문자 변환되기 때문에, v-on:myEvent는 자동으로 v-on:myevent로 변환된다. 따라서 케밥케이스 권장.
    이벤트 발생
    vm.$emit("이벤트명", [파라미터]);
    vm.$emit("speed", 100);
    이벤트 수신
    vm.$on("이벤트명", [콜백함수]);
    vm.$on("speed", function(speed){});

하위에서 상위 컴포넌트로 event 전달

  • 하위 컴포넌트에서 상위 컴포넌트가 지정한 이벤트를 발생 ($emit)
  • 상위 컴포넌트는 하위 컴포넌트가 발생한 이벤트를 수신(on)하여 data 처리
    이벤트 발생
    vm.$emit("이벤트명");
    이벤트 수신
    <child v-on:이벤트명="상위 컴포넌트 메소드명"></child>

비상하위간 통식

  • 비어있는 Vue Instance 객체를 Event Bus로 사용
  • 복잡해질 경우 상태관리 라이브러리 Vuex 사용 권장
var bus = new Vue();
// 컴포넌트 A
bus.$emit('id-selected', 1);
// 컴포넌트 B
bus.$on('id-selected', function(id){});
profile
기록용 공부용 개발 블로그

0개의 댓글