008

01. 컴포넌트

Vue Component

화면의 영역을 구분하여 개발할 수 있는 vue의 기능

→ 재사용성이 올라가고 빠르게 화면 제작 가능

기본적으로 인스턴스를 하나 생성하면 컴포넌트로 생성된다.

전역 컴포넌트

  • 플러그인이나 라이브러리로 전역으로 사용해야 하는 경우에 전역 컴포넌트 형식을 사용한다.
  • Vue.component('컴포넌트 이름', 컴포넌트 내용);
<div id="app">
    <app-header></app-header>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    Vue.component('app-header', {
        template: '<h1>Header</h1>'
    });

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

Untitled

지역 컴포넌트

  • 특정 컴포넌트 하단에 작성, 즉 전역으로 접근되지 않는다.
  • 특정 컴포넌트 하단의 여러 컴포넌트들을 속성을 통해 확인할 수 있다.
new Vue({
  el: "#app",
  components: {
    "app-footer": {
      template: "<footer>footer</footer>",
    },
  },
});

대부분 특별한 경우 아니고는 지역 컴포넌트를 생성해서 웹 구성

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

  • 전역 컴포넌트는 기본적으로 생성한 모든 인스턴스에 등록된다.
  • 지역 컴포넌트는 인스턴스마다 새로 생성해줘야 한다.

2. 컴포넌트 통신 방식

컴포넌트 통신

  • 컴포넌트를 구분해서 생성하게 되면 컴포넌트들 간의 ‘관계’가 생성된다.
  • 컴포넌트는 각각 데이터 유효 범위를 가진다. → 따라서 특정 규칙을 따라야 데이터 교환 가능
  • 상위 → 하위로는 데이터를 내려준다 : props 속성
  • 하위 → 상위로는 이벤트를 올려준다 : event 발생

왜 규칙이 필요할까?

  • 특정 컴포넌트의 변화에 따라서 나머지 컴포넌트가 유기적으로 데이터를 주고 받았을 때, 데이터의 방향을 예측하기 어렵다.
  • 특정 데이터가 바뀌었을 때 발생하는 버그를 찾고 고치기가 어렵다. (n방향 통신의 문제점 : MVC 페턴에서 자주 확인 가능)

props

  • 상위에서 하위로 데이터를 내려준다.
<div id="app">
  <app-header
    v-bind:프롭스
    속성
    이름="상위 컴포넌트의 데이터 이름"
  ></app-header>
</div>

예시 코드

<body>
    <div id="app">
        <app-header v-bind:propsdata="message"></app-header>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var appHeader = {
            template: '<h1>header</h1>',
            props: ['propsdata']
        }

        new Vue({
            el: '#app',
            components: {
                'app-header' : appHeader
            },
            data: {
                message: 'hi'
            }
        })
    </script>
</body>

Untitled 1

Untitled 2

컴포넌트(상위)의 데이터 속성 message 의 ‘hi’가 컴포넌트(하위)의 props 속성 propsdata에 내려온 것을 확인

props 특징

  • 상위 컴포넌트의 데이터 속성 값이 바뀌면, 하위 컴포넌트의 props 값도 바뀐다. → Reactivity 적용

Event emit

  • 하위에서 상위로 이벤트를 올려준다.
<div id="app">
  <app-header
    v-on:하위
    컴포넌트에서
    발생한
    이벤트
    이름="상위 컴포넌트 메서드 이름"
  ></app-header>
</div>

예시 코드

<body>
    <div id="app">
        <app-header v-on:pass="logText"></app-header>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var appHeader = {
            template: '<button v-on:click="passEvent">Click me</button>',
            methods: {
                passEvent: function() {
                    this.$emit('pass')
                }
            }
        }
        new Vue({
            el: '#app',
            components: {
                'app-header': appHeader
            },
            methods: {
                logText : function() {
                    console.log('hi')
                }
            }
        });
    </script>
</body>

Untitled 3

하위 컴포넌트의 event(name:pass)가 상위 컴포넌트에서 발생되어 console.log가 찍히는 것 확인.

예시 코드2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <app-header v-on:pass="logText"></app-header>
        <app-content v-on:plus="plusNum"></app-content>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var appHeader = {
            template: '<button v-on:click="passEvent">Click me</button>',
            methods: {
                passEvent: function() {
                    this.$emit('pass');
                }
            }
        }

        var appContent = {
            template: '<button v-on:click="addNumber">add</button>',
            methods : {
                addNumber : function() {
                    this.$emit('plus');
                }
            }
        }

        new Vue({
            el: '#app',
            components: {
                'app-header': appHeader,
                'app-content': appContent
            },
            methods: {
                logText : function() {
                    console.log('hi');
                },
                plusNum: function() {
                    this.num += 1;
                    console.log(this.num);
                }
            },
            data: {
                num:10
            }
        });
    </script>
</body>
</html>

Untitled 4

num을 하나씩 증가시키는 함수 plusNum 생성
(div#app data인 num은 this.num으로 접근 가능)
app-content에서 plus=”plusNum”을 사용하여 상위 컴포넌트로 이벤트 발생

카테고리: ,

업데이트:

댓글남기기