3 minute read


1. 뷰 템플릿이란?

뷰의 템플릿은 HTML, CSS 등의 마크업 속성과 뷰 인스턴스에서 정의한 데이터 및 로직을 연결하여 사용자가 브라우저에서 볼 수 있는 형태의 HTML로 변환해주는 속성이다.

뷰에서 템플릿 속성을 사용하는 방법은 두 가지가 있는데 ES5 사용법과 ES6 사용법이 있다.

우선 ES5 템플릿 사용법은 뷰 인스턴스의 template 속성을 사용하는 것이다.

1
2
3
4
5
6
//뷰 인스턴스 template 속성 사용 방법
<script>
    new Vue({
        template : '<p>Hello </p>'
    });
</script>

지금까지 계속 써왔던 일반적인 인스턴스의 사용법과 같다.

두 번째는 ES6에서 사용하는 방법으로 싱글 파일 컴포넌트 체계의 template 코드를 사용하는 방법이다.

1
2
3
<template>
    <p>Hello <p>
</template>

여기서 싱글 파일 컴포넌트는 컴포넌트의 템플릿, 로직, 스타일을 하나의 파일로 묶어낸 파일 형식으로 차후에 다뤄보도록 하겠다.



2. 템플릿에서의 뷰의 속성

2.1 데이터 바인딩

데이터바인딩은 HTML 화면 요소를 뷰 인스턴스의 데이터와 연결하는 것으로 또는 v-bind 를 사용한다.

2.1.1 {{ }}

중괄호는 뷰 인스턴스의 데이터를 HTML 태그에 연결하는 가장 기본적인 방법이다.
앞서 많이 사용해봐서 익숙한 방법인만큼 간단한 샘플 코드만 보고 넘어가자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="app">
    {{ message }}
</div>

<script>
    new Vue({
        el : '#app',
        data : {
            mseeage : 'Hello Vue.js'
        }
    });
</script>


2.1.2 v-bind

v-bind는 아이디, 클래스, 스타일 등의 HTML 속성 값에 뷰 데이터 값을 연결할 때 사용하는 방법이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<div id="app">
    <p v-bind:id="idA">아이디 바인딩</p>
    <p v-bind:class="classA">클래스 바인딩</p>
    <p v-bind:style="styleA">스타일 바인딩</p>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

<script>
    new Vue({
        el: '#app',
        data: {
            idA: 10,
            classA: 'container',
            styleA: 'color: blue'
        }
    });
</script>

위 코드를 보면 뷰 인스턴스 영역의 data 속성의 값을 html의 id, class, style의 앞에 v-bind를 사용하여 연결하고 있다. 또한 v-bind는 문법을 간호화 하여 사용할 수 있는데, v-bind:id를 :id로 단순화하여 사용할 수 있다.


2.2 자바스크립트 표현식

뷰의 템플릿에서도 자바스크립트 표현식을 사용할 수 있다. 위에서 언급한 를 사용해서 스크립트 표현식을 넣으면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<div id="app">
    <!-- {{ var a = 10; }} 선언문 사용 불가 -->
    <!-- {{ if (true) {return 100} }}    분기 사용 불가 -->
    {{ true ? 100 : 0 }} <!-- 삼항 연산자 사용 가능 -->

    <!-- 사용 가능하지만 가능한 연산은 인스턴스에서 -->
    {{ message.split('').reverse().join('') }} 

    <!-- 인스턴스에서 계산후 표현만 -->
    {{ reversedMessage }} 
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

<script>
    new Vue({
        el: '#app',
        data: {
            message: 'Hello Vue.js!'
        },
        methods: {
            reverseMsg: function() {
                this.message = this.message.split('').reverse().join('');
                return this.message;
            }
        }
    });
</script>

스크립트 표현식을 사용할 때 주의점이 있는데 선언문이나 분기 구문은 사용할 수 가 없다. 하지만 삼항연산자는 사용할 수 있으며 연산이 필요한 부분도 가급적 인스턴스 내에서 처리 후 표현하는 것을 권장한다.
처음보는 computed 라는 속성은 아래에서 내용에서 알아보자.



2.3 디렉티브

디렉티브는 HTML 태그 안에 v- 접두사를 가지는 모든 속성을 의미한다.
화면의 요소를 더 쉽게 조작하기 위해 사용하며 뷰의 데이터 값이 변경되었을 때 화면의 요소들이 리액티브하게 반응하여 변경된 데이터 값에 따라 갱신된다.

디렉티브 이름 역할
v-if 지정한 데이터의 true, false 여부에 따라 해당 태그 표시
v-for 지정한 뷰 데이터의 개수만큼 태그 반복 출력
v-show if와 마찬가지로 true, false 여부에 따라 태그를 표시하지만 false 일 경우 display:none 처리
v-bind HTML태그의 기본 속성과 뷰 데이터 속성을 연결
v-on 화면 요소의 이벤트를 감지하여 처리
v-model 폼(form)에서 주로 사용하고 폼에 입력한 값을 뷰 인스턴스의 데이터와 즉시 동기화
input, select, textarea 태그에만 사용 가능

말이 어렵게 느껴질 수 있지만 조금 생소할 수 있는 bind와 model을 간단히 보자면 bind는 자바스크립트의 attr 속성, model은 val 속성이라고 생각하면 편하다.



2.4 이벤트 처리

v-on 디렉티브와 methods 속성을 사용해서 이벤트를 처리할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div id="app">
    <button v-on:click="clickBtn">클릭</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

<script>
    new Vue({
        el: '#app',
        methods: {
            clickBtn: function() {
                alert('clicked');
            }
        }
    });
</script>

위의 샘플코드와 같이 button에 v-on 디렉티브를 사용하여 click 이벤트를 걸어주고 인스턴스에서 methods 속성을 이용해 clickBtn 함수를 정의해줬다.
버튼을 클릭하면 methods 속성에 선언한 clickBtn이 실행되고 alert 팝업이 뜨게된다.
우리가 흔히 자바스크립트에서 사용하던 것 처럼 메서드를 호출할 때 v-on:click=”clickBtn(10)”과 같이 인자를 넘겨줄 수 있으며, 따로 메서드 인자를 전달하지 않아도 메서드에 clickBtn:function(evt)와 같이 해동 돔 요소의 이벤트 객체에 접근할 수 있다.