등록
Vue 컴포넌트로 등록하는 방법은 크게 2가지로 나눌 수 있습니다.
글로벌(Global) 등록
Vue.component
메서드에 컴포넌트 이름(문자 타입)과 인스턴스 옵션 객체를 전달하면 재사용 가능한 컴포넌트로 등록됩니다. 이 방법으로 등록된 컴포넌트는 글로벌 컴포넌트가 됩니다.
const componentOption = {
template: `<div class="user-component"> ... </div>`,
data: () => ({ ... }),
created() { ... },
computed: { ... },
watch: { ... },
methods: { ... }
};
Vue.component('UserComponent', componentOption);
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
로컬(Local) 등록
또 다른 방법은 Vue 인스턴스 옵션 components에 컴포넌트를 등록하는 것입니다. 이 방법으로 등록되면 로컬 컴포넌트가 됩니다.
new Vue({
el: '#app',
components: {
UserComponent: {
template: `...`,
data: () => ({}),
// ...
}
}
})
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
NOTE
v-once 디렉티브를 설정하면 정적 컴포넌트로 단 1회만 렌더링됩니다. 업데이트 하지 않아도 되는 엘리먼트들을 정적으로 랜더링 한다면 보다 나은 성능을 보일 수 있습니다.
Vue.component('UserComponent', {
template: `<div v-once>...</div>`
});
1
2
3
2
3
다만,
이 패턴을 과도하게 사용하면 혼란을 야기할 수 있으니 사용에 주의가 필요합니다. 예를 들어 v-once
디렉티브에
익숙하지 않은 팀원은 컴포넌트가 업데이트 되지 않은 이유를 몰라 많은 시간을 디버깅에 소모할 수 있습니다.
Vue 파일 등록
Vue 파일은 재사용 가능한 컴포넌트 입니다. 즉, 컴포넌트 파일은 다른 컴포넌트 파일을 불러와 사용할 수 있습니다.
components/UserComponent.vue
<template>
<div class="user-component">
<!-- 템플릿 -->
</div>
</template>
<script>
export default {
name: 'UserComponent',
// 인스턴스 옵션
}
</script>
<style scoped>
/* 스타일 */
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
글로벌 컴포넌트로 등록하려면 main.js
에 아래와 같이 코드를 작성합니다.
main.js
import Vue from 'vue';
import UserComponent from './components/UserComponent';
// 글로벌 컴포넌트 등록
Vue.component('user-component', UserComponent);
1
2
3
4
5
2
3
4
5
NOTE
여러 개의 컴포넌트를 일괄적으로 글로벌 등록하려면 다음과 같이 작성할 수 있습니다.
registerGlobalComponents.js
import Vue from 'vue';
import ComponentA from '@/components/componentA';
import ComponentB from '@/components/componentB';
import ComponentC from '@/components/componentC';
[ComponentA, ComponentB, ComponentC].forEach(c => Vue.component(c.name, c));
1
2
3
4
5
6
7
2
3
4
5
6
7
로컬 컴포넌트로 등록하려면 컴포넌트 파일에 아래와 같이 코드를 작성합니다.
App.vue
<script>
import UserComponent from './components/UserComponent';
export default {
components: { UserComponent }
}
</script>
1
2
3
4
5
6
7
2
3
4
5
6
7
참고
보다 자세한 내용은 컴포넌트 등록 문서를 참고하세요.