Study/Vue

Vue.js 시작하기 03. 컴포넌트

going.yoon 2022. 1. 18. 23:00

뷰 컴포넌트란, 

화면에서 영역을 구분하여 개발할 수 있는 뷰의 기능이다.

각각 구분된 구분을 컴포넌트라고 부른다.

https://xzio.tistory.com/1490

 

컴포넌트는 오른쪽 그림처럼, 컴포넌트들이 생성되면 컴포넌트'간'의 관계가 생긴다.

 

#전역 컴포넌트

1. 뷰 인스턴스를 생성하면 가장 먼저 Root 컴포넌트가 생긴다.

2. 아래와 같이 헤더, 컨텐츠 컴포넌트를 생성해준다.

<body>
    <div id="app">
        <app-header></app-header> <!-- 사용자가 정의한 태그 : Vue.component로 정의해줌. -->
        <app-content></app-content>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
       // Vue.component('컴포넌트 이름', 컴포넌트 내용);
        Vue.component('app-header',{
            template: '<h1>Header</h1>'
        });

        Vue.component('app-content',{
            template: '<div>content</div>'
        })

        new Vue({
            el: '#app'
        });
    </script>
</body>

3. 결과물

 

위와 같이 AppHeader 컴포넌트와 AppContent 컴포넌트라는 전역 컴포넌트가 생긴 것을 확인할 수 있다.

 

 

 

#지역 컴포넌트

뷰 인스턴스 생성 후 Vue.component('컴포넌트명', 컴포넌트 내용)으로 속성을 추가해주는 것이 아니라, 인스턴스 생성 시점에 컴포넌트 속성을 정의해 줄 수 있는 방법도 있다.

<body>
    <div id="app">
        <app-header></app-header> <!-- 사용자가 정의한 태그 : Vue.component로 정의해줌. -->
        <app-content></app-content>
        <app-footer></app-footer>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
       // Vue.component('컴포넌트 이름', 컴포넌트 내용);
        Vue.component('app-header',{
            template: '<h1>Header</h1>'
        });

        Vue.component('app-content',{
            template: '<div>content</div>'
        })

        new Vue({
            el: '#app',
            components: {
                //컴포넌트 이름 : 컴포넌트 내용을 넣어줌.
                'app-footer': {
                    template: '<footer>footer</footer>'
                }
            }

        });
    </script>
</body>

 

지역 컴포넌트 footer가 생성된 것을 확인할 수 있다.

 

 

 

아니 근데 전역 컴포넌트(Component) 지역 컴포넌트(Components) 어짜피 루트 밑에 생기는건 똑같은데 왜 나눠서 등록을 하는 것인지?

 

보통 실무에서는 전역컴포넌트는 라이브러리 형태로 임포트해서 사용하고,

지역컴포넌트는 특정 화면에서 계속 속성을 더해가며 사용하기 떄문에 어떤 컴포넌트들이 사용되었는지 한눈에 보기 용이하다.

 

 

#컴포넌트와 인스턴스와의 관계

id가 app인 div와, id가 app2인 div를 각각 하나씩 만들고, 각각의 태그에 Vue 인스턴스를 할당해주었다. 

<body>
    <div id="app">
        <app-header></app-header> <!-- 사용자가 정의한 태그 : Vue.component로 정의해줌. -->
        <app-footer></app-footer>
    </div>
    <div id="app2"></div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
       // Vue.component('컴포넌트 이름', 컴포넌트 내용);
        Vue.component('app-header',{
            template: '<h1>Header</h1>'
        });

        new Vue({
            el: '#app',
            components: {
                //컴포넌트 이름 : 컴포넌트 내용을 넣어줌.
                'app-footer': {
                    template: '<footer>footer</footer>'
                }
            }

        });

        new Vue({
            el : '#app2'
        });
    </script>
</body>

이때, 뷰 인스턴스가 생성될 때마다 Root 컴포넌트가 생성되기 때문에 컴포넌트 구성은 아래와 같아진다.

엇 그런데 두번째 Root 밑에 AppHeader 컴포넌트가 생겼다. 

그 이유인 즉슨, 전역컴포넌트로 생성된 App Header는 뷰의 인스턴스가 생성될 때 마다 자동으로 Root 컴포넌트 아래에 생성되고,

지역컴포넌트로 생성된 AppFooter는 매번 뷰의 인스턴스 내에 정의를 해줘야 한다.

 

 

 

해당 포스팅은 인프런의 Vue.js 시작하기 - Age of Vue.js 학습 후 정리한 내용임을 알려드립니다.