참고 : Vue.js 입문책을 읽고 학습한 내용을 블로그에 정리한 글이므로 내용상 오류가 있을 수 있습니다.
오류가 있다면 댓글 남겨주시면 감사하겠습니다.
컴포넌트란???
-
레고 블럭과 같이 재사용이 가능한 최소 단위
-
화면 전체를 각각 역할에 맞게 영역별로 잘개 쪼개어서 사용됩니다
1. 컴포넌트 등록
지역(Local)컴포넌트 등록
new Vue({
components : {
'컴포넌트 이름' : 컴포넌트 내용
}
});
- 특정 인스턴스에서 유효한 범위에서만 사용 가능
- 인스턴스에 components 속성을 추가하고 등록할 컴포넌트 이름과 내용을 정의합니다
전역(Global)컴포넌트 등록
Vue.component('컴포넌트 이름', {
// 컴포넌트 내용
})
- 모든 범위의 여러 인스턴스에서 사용 가능
- Vue 생성자에서 .component()를 호출하여 등록할 컴포넌트 이름과 내용을 정의합니다.
지역 컴포넌트와 전역 컴포넌트 유효범위
<div id="test1">
<h4>test1 인스턴스 영역</h4>
<global-component></global-component>
<local-component></local-component>
</div>
<hr>
<div id="test2">
<h4>test2 인스턴스 영역</h4>
<global-component></global-component>
<local-component></local-component>
</div>
<script>
Vue.component('global-component', {
template : '<div>전역 컴포넌트</div>'
});
new Vue({
el : '#test1',
components : {
'local-component' : {
template : '<div>지역 컴포넌트</div>'
}
}
})
new Vue({
el : '#test2'
});
</script>
HTML에서 첫 번째와 두 번째div태그에 모두 전역 컴포넌트와 지역 컴포넌트를 등록했지만
Script에서 첫 번째 인스턴스 영역에만 지역 컴포넌트를 등록했기 때문에
화면에서 첫 번째 영역에는 전역 컴포넌트, 지역 컴포넌트 내용이 출력 되지만
두 번째 영역에서는 전역 컴포넌트만 출력됩니다.
- 전역 컴포넌트는 한 번 등록하면 어느 인스턴스 영역에서든 사용할 수 있습니다.
- 지역 컴포넌트는 등록한 인스턴스 영역에서만 사용할 수 있습니다.
2. 컴포넌트 통신
Vue에서 컴포넌트들 끼리는 각각 고유한 유효범위를 가지고 있기 때문에 아무렇게나 다른 컴포넌트의 값을 참조할 수가 없습니다. 그렇기 때문에 컴포넌트들 끼리 통신하기 위해서는 뷰 프레임워크에서 정의한 컴포넌트 데이터 전달 방법을 사용해야 합니다.
2-1 상위 컴포넌트에서 하위 컴포넌트로 데이터 전달
- props : 상위 컴포넌트에서 하위 컴포넌트로 데이터 전달할 때 사용하는 속성
(html)
<div id = "test">
<하위 컴포넌트 v-bind : props속성 이름 = "상위 컴포넌트 data속성"></하위 컴포넌트>
</div>
(하위 컴포넌트)
Vue.component('하위 컴포넌트', {
props : ['props속성 이름'],
template : '<b>{{props속성 이름}}</b>'
});
(상위 컴포넌트)
new Vue({
el : '#test',
data : {
상위 컴포넌트 data속성 : data 내용
}
})
1. 하위 컴포넌트에 props속성을 정의합니다.
2. 상위 컴포넌트에 data속성과 data내용을 정의합니다
3. html에 하위 컴포넌트 태그를 추가합니다
4. 하위 컴포넌트 태그에서 v-bind속성을 이용해 상위 컴포넌트의 data 내용을 하위 컴포넌트 props속성에 전달합니다.
5. 상위 컴포넌트에서 전달받은 data 내용을 하위 컴포넌트의 template을 통해 화면에 출력합니다.
예제
<body>
<div id = "test">
<child-component v-bind:propsdata = "text"></child-component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
Vue.component('child-component', {
props : ['propsdata'],
template : '<b>{{propsdata}}</b>'
});
new Vue({
el:'#test',
data:{
text:'parent-component -> child-component'
}
})
</script>
</body>
출력
2-2 하위 컴포넌트에서 상위 컴포넌트로 이벤트 전달
- $emit() : 이벤트 발생
- v-on: 이벤트 수신
(html)
<div id = "test">
<child-component v-on:child-hi = "parent"></child-component>
</div>
(하위 컴포넌트)
Vue.component('child-component', {
template:'<button v-on:click = "child">check</button>',
methods:{
child: function() {
this.$emit('child-hi');
}
}
});
(상위 컴포넌트)
new Vue({
el:'#test',
methods: {
parent:function() {
console.log("child-hi -> parent")
}
}
})
1. (하위 컴포넌트) check[버튼 클릭]
2. (하위 컴포넌트) v-on:click[이벤트 수신] = "child"[메서드 실행]
3. ("child"메소드 안) this.$emit('child-hi)[이벤트 발생]
4. (html) v-on:child-hi[이벤트 수신] = "parent"[메서드 실행]
5. (상위 컴포넌트) console.log("child-hi -> parent")[화면에 출력]
예제
출력
'Vue' 카테고리의 다른 글
[Vue] HTTP 통신 (0) | 2020.02.13 |
---|---|
[Vue] 라우터(기초) (0) | 2020.01.31 |
[Vue] 인스턴스 (0) | 2020.01.29 |
[Vue] 개발 환경 설정(Window) (0) | 2020.01.27 |
Vue란?? (0) | 2020.01.27 |