Vue 컴포넌트

devjune·2021년 6월 16일
0

Vue.js

목록 보기
2/36

이번엔 Vue의 컴포넌트에 관해 정리하려고 한다.

Vue는 한 화면의 여러 요소를 단위별로 나눌 수 있다. 나뉜 하나의 단위를 Component라고 한다.

이렇게 하나의 화면을 크게 3개의 컴포넌트로 나누고, 나뉜 컴포넌트에 또 세세하게 나눌 수 있다.
컴포넌트라는 특징으로 중복된 요소를 제거하고, 재사용성이 올라가며, 작업의 능률이 향상된다.

  • 전역 컴포넌트
  • 지역 컴포넌트

컴포넌트는 위 2개로 구분하여 사용할 수 있다.

단어 뜻 그대로
모든 곳에서 사용할 수 있는 컴포넌트가 전역,
특정한 곳에서만 사용 가능한 컴포넌트가 지역이다.

프로젝트를 진행하며 느끼고 강의에서도 들었던 것처럼
전역 컴포넌트는 주로 플러그인, 라이브러리 등 여러 곳에서 사용하는 것들만 사용하고,
대부분 지역 컴포넌트를 사용한다. (주로 하위 컴포넌트를 등록할 때 사용)

그렇다면 컴포넌트 끼리는 어떤 방식으로 통신 할까?

컴포넌트의 통신 방식 props, event emit

- props : 상위컴포넌트의 데이터를 하위 컴포넌트로 전달하기 위해 사용
- emit : 하위 컴포넌트의 데이터를 특정 이벤트를 발생시켜 상위 컴포넌트에 전달하기 위해 사용.

자세한 사용 방법은 코드를 보며 얘기 하겠다.

<div id="app">
    <app-header v-bind:propsdata="num"></app-header>
    <app-content v-on:increase="increaseNumber"></app-content>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<p>{{ propsdata }}</p>',
        props: {
            propsdata: Number
        }
    }
    
    var appContent = {
        template: '<button @click="addNumber">add</button>',
        methods: {
            addNumber() {
                this.$emit('increase');
            }
        }
    }

    var vm = new Vue({
        el: "#app",
        components: {
            'app-header': appHeader,
            'app-content': appContent
        },
        data: {
            num: 0
        },
        methods: {
            increaseNumber() {
                this.num++;
            }
        }
    });
</script>

위 코드는 add버튼을 클릭하면 숫자가 1씩 증가하는 코드이다.

우선 add버튼은 app-content에 생성한다.
add버튼을 클릭하면 addNumber라는 메소드가 실행되고 this.$emit('increase')를 통해
@increase라는 사용자 정의 이벤트가 발생되고 상위 컴포넌트의 increaseNumber() 메소드와 연결되어 해당 메소드가 실행된다.

increaseNumber() 메소드에서는 data로 정의된 num을 1 증가시킨다.
증가됨과 동시에 app-header에 props로 정의된 propsdata에 v-bind를 이용하여 값을 binding시킨다.

app-header에서는 props로 받은 propsdata를 화면에 표현하게 된다.

이렇게 상위 컴포넌트와 하위 컴포넌트의 데이터 통신 방식에 대해 알아보았다.

그런데, app-content에서 app-header로 바로 줄 수는 없는걸까?

결론부터 말하면 줄 수 없다. 이다.

강의를 들으면서 나도 '직접 전달하면 편하지 않을까?' 라는 생각을 하였지만, 이런 규칙을 만듦으로써 데이터의 흐름을 추적할 수 있고, 코드의 유지보수가 쉬워지는 특징을 가질 수 있다.

출처 인프런 Vue.js 시작하기 - Age of Vue.js

profile
개발자준

0개의 댓글