우리가 웹페이지에서 하는 모든 동작, 그것이 바로 이벤트다. 마우스를 움직이면, mousemove 이벤트고 키보드를 누르면 keypress 이벤트 클릭을 하면 click 이벤트다, 이렇게, 웹에서 사용될 수 있는 이벤트들의 목록은 w3school 에서 모두 참조할 수 있다.

 

이번에도 JSBin(https://jsbin.com/fivomus/1/edit?html,js,output)을 사용하던 본인의 서버를 사용하던 자유다

 

카운터를 만들기 위해선, 버튼의 click 이벤트 발생 시 우리가 준비한 작업을 하도록 설정을 해야한다. 그러기 위해선 이벤트가 발생 했을 때 어떤 작업을 할 지, 함수를 준비해야한다. 이 함수는 우리의 뷰 인스턴스 내부에 위치해있는데, Vue 객체와 관계가 있으므로, 이를 메소드 (method) 라고 부른다.

메소드를 준비할때는, 우리가 뷰 인스턴스에서 사용 할 데이터들을 data 안에 넣은 것 처럼, 함수들을 만들어서 뷰 인스턴스의 methods 안에 넣으면 된다.

이제, 데이터 모델에 number 라는 변수를 만들고, 값을 증가시키는 increment, 감소시키는 decrement 메소드들을 준비한다.

var app = new Vue({
  el: '#app', 
  data: {
    number: 0
  },
  // app 뷰 인스턴스를 위한 메소드들
  methods: {
    increment: function() {
      // 인스턴스 내부의 데이터모델에 접근 할 땐,
      // this 를 사용한다
      this.number++;
    },
    decrement: function() {
      this.number--;
    }
  }
});

메소드 내에서 인스턴스 내부의 데이터 모델에 접근 할 때에는 this 키워드를 사용합니다.

 

HTML 에서 number 값을 보여주고, 버튼 두개도 만들어주자

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app">
    <h1>카운터: {{ number }}</h1>
    <button>증가</button>
    <button>감소</button>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

 

아직까지는 버튼을 눌러도 아무 반응이 없다

 

v-on 디렉티브를 이벤트를 처리 할 태그(들) 에 설정 하면 된다. 이번엔 button 태그에 넣어주면 된다

이 디렉티브를 설정 할 때는 다음과 같은 형식으로 한다.

v-on:이벤트이름="메소드이름"

 

우리가 이번에 처리 할 이벤트 이름은 click 이고, 메소드 이름은 increment 혹은 decrement 가 되겠다.

그럼, 코드를 작성해보자

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app">
    <h1>카운터: {{ number }}</h1>
    <button v-on:click="increment">증가</button>
    <button v-on:click="decrement">감소</button>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

클릭시 증가와 감소가 일어난다

Vue 를 사용하면 자바스크립트를 그렇게 많이 입력하지 않아도, 이렇게 쉽게 구현 할 수 있다.

 

위 코드를 조금더 편하게 작성 할 수 있는 방법이 존재한다. 바로, v-on: 을 @ 로 대체하는 것 이다.

<div id="app">
  <h1>카운터: {{ number }}</h1>
  <button @click="increment">증가</button>
  <button @click="decrement">감소</button>
</div>

이렇게 Vue.js 의 핵심 기능 중 하나인 디렉티브를 모두 조금씩 다뤄봤다.


WRITTEN BY
Clasha

,

이번에는 v-model을 사용해보겠다.

JSBin(https://jsbin.com/fivomus/1/edit?html,js,output)을 사용하던 본인의 서버를 사용하던 자유다

(JSBin사용시 Auto-run JS를 체크해두자)

 

v-model?

데이터 → 뷰 의 형태로 바인딩이 되어있어서, 데이터의 값이 변하면  바로 바로 업데이트가 된다

이게 바로 단 방향 바인딩이다. 한쪽으로만 데이터가 흐른다는건데.

양 방향 바인딩은 뷰 ⇄ 데이터형태로 바인딩하여 데이터가 양 방향으로 흐르게 해주는 것 이다.

즉, 데이터에 있는 값이 뷰에 나타나고, 이 뷰의 값이 바뀌면 데이터의 값도 바뀌는것이다.

이제 실제로 사용해보자

 

HTML 에서 input 태그를 작성하고, 그 태그의 v-model 디렉티브를 데이터 레퍼런스 이름으로 설정하자. 우리의 경우엔. name 이 되겠다.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app">
    <h1>Hello, {{ name }}</h1>
    <input type="text" v-model="name"/>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

js파일

var app = new Vue({
  el: '#app', 
  data: {
      { name: 'Vue' },

  }   
});

 

결과창

실행당시
값 입력시

 

이렇게 유저가 우리 만든 어플리케이션과 인터랙트 할 때마다, 해당 변화가 바로 모델에 반영된다. 그리고 그 모델에 반영된 값에 따라서, 다른 결과를 사용자에게 보여줄 수 있다.

이제 응용을 해보자 예전에 햇던 개구리 심경변화 예제를 이용해보자

 

이 프로젝트를 진행할때, 콘솔에서 바로 값을 입력해주었는데 한번 이번에는 체크박스를 만들어서 그 체크박스의 값에 따라서 개구리의 기분에 변화를 줘보겠다.

그리고, HTML 부분에서, 체크박스 인풋을 만들고, v-model 값을 smile 로 설정한다.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app">
    <h1>Hello, {{ name }}</h1>
    <h3><input type="checkbox" v-model="smile"/>웃어요 개구리</h3>
    <img :src="smile ? feelsgood : feelsbad"/>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>
var app = new Vue({
    el: '#app', 
   
    data: {
      name: 'Vue',
      smile: true,
      feelsgood: 'https://imgh.us/feelsgood_1.jpg',
      feelsbad: 'http://imgh.us/feelsbad.jpg'
    }   
  });

 

결과

체크 전

v-model 디렉티브는 이렇게 폼에 관련된 태그에만 사용 될 수 있다: <input> <select> <textarea>

폼을 컨트롤하는데에는 정말 유용하다,  다음에 배울 v-on 디렉티브는, 이벤트 처리를 담당하는 디렉티브로서,

더 많은 종류의 인터랙션을 관리 할 수 있게 된다.


WRITTEN BY
Clasha

,

v-for 디렉티브는, HTML 에서 for-loop 을 구현하기 위하여 사용된다. 즉, 비슷한 내용을 반복적으로 보여줄 때 사용되는데. 실제 프로젝트에서도 자주 사용된다. 예를들어서, 게시판의 게시물 목록을 렌더링 할 때, 이 디렉티브가 사용되며. 또 덧글의 목록을 렌더링 할때도 사용된다. 무언가의 목록을 구현 할 때 주로 사용된다. 

 

이번 강좌에서도 브라우저상에서 바록 웹 코딩을 할 수 있는 JSBin(https://jsbin.com/fivomus/1/edit?html,js,output)을 이용하거나 Vue js 환경을 작성했다면 해당 환경을 이용해서 해도 된다..

 

간단하게 할 일 리스트를 작성해보자

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <script>

  
  </script>
</head>
<body>
  
  <div id="app">
    <h2>오늘 할 일</h2>
    <ul>
      <li>Vue</li>
      <li>방 청소</li>
      <li>책 읽기</li>
    </ul>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

이제 v-for를 이용해서 데이터를 불러와보겠다.

 

 

데이터 설정

우선, 렌더링 할 데이터들을 객체 배열 형식으로 자바스크립트 코드 안에 입력하자.

var app = new Vue({
  el: '#app', 
  data: {
    todos: [
      { text: 'Vue.js 튜토리얼 작성하기' },
      { text: 'Webpack2 알아보기' },
      { text: '사이드 프로젝트 진행하기' }
    ]
  }   
});

 

자, 이제 v-for 디렉티브를 사용해보자. 

이 디렉티브는 item in items 의 형식으로 작성한다.

여기서 items 는 Vue 엘리먼트의 데이터 안에 들어있는 배열 이름으로 설정하고,

item 은 렌더링 하게 될 때, 각 원소를 가르키는 별침(alias)이다

그럼 HTML 을 다음과 같이 수정하자.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app">
    <h2>오늘 할 일</h2>
    <ul>
      <li v-for="todo in todos">{{ todo.text }}</li>
    </ul>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

 

결과창을 보자

 

index 값 받아오기

렌더링을 할 때, 각 원소들을 순서번호(index) 를 가져오려면, 디렉티브 값에 (todo, index) in todos 형식으로 작성을 하면 된다.

여기서 index 라는 레퍼런스 이름은 우리가 정하는 것이기 때문에, i 로 대체해도 상관 없다.

v-for는 여기까지 하고 다음은 v-model을 사용해보겠다.


WRITTEN BY
Clasha

,

이번에는 지난번에 이어서 남은 지시문들을 하나씩 해보자 오늘은 v-bind를 사용해보겠다.

지난번에 서버를 세팅했으니 나는 그 서버에서 하겠지만,

지금까지 했던 JSBin(https://jsbin.com/fivomus/1/edit?html,js,output)에서 할 사람들은 거기서 해도 된다.

 

아래와 같이 코드를 입력해두자

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <script>
    var app = new Vue({
     el: '#app', 
      
       data: {
       name: 'Vue'
      }   
    });
  </script>
</head>
<body>
  
  <div id="app">
    <h1>Hello, {{ name }}</h1>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

 

머스태쉬 태그 {{ }} 를 사용해서 name 값을 설정하도록 하자. 이렇게 HTML 태그 안의 내용을 Vue 인스턴스 안의 데이터값으로 설정 할 수 있다. 하지만, HTML 태그의 속성 값을 데이터값을 사용해야 한다면 어떻게 해야할까?

예를 들어서, 이미지 태그 <img src="링크"/> 의 링크 부분에서 데이터 값을 사용하고 싶다면? 뭐 이런 시도를 해볼 수 있다.

<img src={{ image }}/> 라던지.. <img src="{{ image }}"/> 라던지.. 시도를 해볼 수 도 있죠.하지만,

이렇게 하면 작동하지 않고, 다음과 같은 경고가 발생한다. (전자의 경우엔 그냥 작동만 안하고 오류는 발생하지 않는다)

[Vue warn]: src=”{{image}}”: Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead. For example, instead of <div id=”{{ val }}”>, use <div :id=”val”>. 

여기서 해결법으로 v-bind 를 사용하자.. 한번 그럼 사용을 해보자.

 

사용법

사용법은 꽤 간단하다. 만약에, 여러분들이 HTML 엘리먼트에서 src 값을 Vue 엘리먼트의 데이터 중 image 로 설정하고 싶다면, <img v-bind:src="image"/> 와 같은 형식으로 하면 된다. v-bind: 뒤에 속성의 이름을 넣어주자

 

코드를 입력해보자

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <script>

  var app = new Vue({
    el: '#app', 
   
    data: {
      name: 'Vue',
      feelsgood: 'https://imgh.us/feelsgood_1.jpg'
    }   
  });
  </script>
</head>
<body>
  
  <div id="app">
    <h1>Hello, {{ name }}</h1>
    <img v-bind:src="feelsgood"/>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

잘 작동한다.

간단하게 사용하기

편의를 위해서, v-bind 를 생략 할 수 있다. 그냥 콜론 뒤에 속성의 이름만 넣어주면된다.

img 태그을 아래처럼 수정하자

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app">
    <h1>Hello, {{ name }}</h1>
    <img :src="feelsgood"/>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

아까와 똑같이 작동할거다.

 

응용

사실, 머스태쉬 태그나, 디렉티브를 사용 할 때, 그 내부의 값을 꼭 데이터 명으로 해야 하는건 아니다 그 안에 자바스크립트 표현식을 사용 할 수도 있다.

머스태쉬 태그 안에 자바스크립트 코드를 입력하여 현재의 시각이 나타나도록 해봤다.

이건 너무 간단하죠? 조금 더 응용을 해보자.

Vue 인스턴스의 데이터 안에 smile 값에 따라 다른 이미지를 보여주게 해보겠다.

코드를 다음과 같이 수정해보자.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <script>

  var app = new Vue({
    el: '#app', 
   
    data: {
      name: 'Vue',
      smile: true,
      feelsgood: 'https://imgh.us/feelsgood_1.jpg',
      feelsbad: 'http://imgh.us/feelsbad.jpg'
    }   
  });
  </script>
</head>
<body>
  
  <div id="app">
    <h1>Hello, {{ name }}</h1>
    <h2>{{ Date() }}</h2>
    <img :src="smile ? feelsgood : feelsbad"/>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

코드를 다 작성하였다면, console 에 들어가서 app.smile 값에 변화를 줬다.

app.smile = false
app.smile = true

지금은 데이터를 계속 콘솔로만 바꾸고 있는데 나중에 이벤트 핸들링을 배우고 나서

버튼으로 이미지를 토글하는 예제를 작성해보겠다.


WRITTEN BY
Clasha

,

나머지 디렉티브를 공부하기 전에 Vue JS 환경실정을 해보겠다.

설치하기 전에 먼저 node js와 npm의 버전을 확인하자.

버전을 확인했으면 이제 설치를 시작해보자

아래 명령어를 입력해주자.

$ npm install vue-cli -g

 

설치하고 나면 vue-cli로 프로젝트를 생성하고 초기설정을 자동으로 설정할 수 있다

$ vue init <template-name> <project-name>

이러한 형식으로 프로젝트를 생성할 수 있는데 template-name에는 몇가지 방법들이 있다.

여기에서는 2가지 설정방법을 알려주겠다. (webpack관련으로 진행하는게 가장 평범하고 가장 많이 사용되기 때문에 webpack관련 2가지만 설명하겠다)

 

webpack-simple template

$ vue init webpack-simple vue-example-project

이렇게 입력하면 몇가지 선택지가 출력된다

 

# 프로젝트 이름 ?
Project name (vue-example-project): 
# 프로젝트 설명 ?
Project description (A Vue.js project): 
# 작성자 ? 
Author (Clasha<dnjsehfud88@gmail.com>): 
# sass 사용여부 ? 
Use sass? (Y/n)

질문시 괄호 안에 있는 내용은 그냥 엔터쳤을 때 반영될 내용이다. 특별히 바꿀 것이 없다면 엔터를 쳐주자

프로젝트가 잘 만들어지고 나면 다음 어떤 행동을 해야하는지까지 잘 설명해주고 있다.

 

  • cd vue-example-project (해당 프로젝트 폴더로 이동)
  • npm install (해당 명령어를 통해 관련 의존성 모듈 설치.)
  • npm run dev (명령어를 실행하면 현재 개발되고 있는 프로젝트를 가동하며, 브라우저에 띄워준다)

 

해당 폴더로 들어가면 각 파일과 폴더들이 있는 것을 볼 수 있는데, 간단하게 설명하도록 하겠다.

index.html 
Vuejs HTML 시작페이지, 개발완료 후 배포시 `index.html`도 같이 배포. 

package.json 
npm 의존성 모듈목록 및 프로젝트 기본설정들이 표기되어 있다. 
그리고 개발모드로 실행하는 것과 배포를 할 수 있는 명령어들이 정의되어 있다. 

src  
`Vuejs` 코드들이 있는 폴더. 실제 이 곳에서 개발을 진행하게 된다. 

webpack.config.js 
개발을 완료하고나면 여러파일들이 있는데, 그 것을 하나로 묶어주고 관리해주는 `webpack`의 설정파일. 

 

 /src 폴더

assets 
이미지나 css등 공통으로 `Vuejs`에서 요청하고 관리될 파일들이 있는 곳이다. 

App.vue 
여기는 `Vuejs` 최상위 컴포넌트라고 생각하면 되고, 
여기에서 본격적으로 `Vuejs`로 개발한다고 생각하시면 된다. 

main.js 
여기가 Vue 인스턴스를 새로 만들고 시작하는 부분이다. 
전역으로 처리해야할 일이 있으면 이 곳에서 진행하면 된다.

그리고 개발완료 후에 npm run build를 하게 되면 배포파일이 생성되는데 이 때 /dist라는 폴더가 생성되고 그 안에 파일들이 생긴다. index.html과 /dist를 복사하여 실제 운영하려고 하는 공간에 복사해서 사용한다

 

webpack template

다음은 정말 자주 사용될 템플릿모드다.

$ vue init webpack vue-example-project

템플릿만 webpack으로 지정하여 프로젝트를 생성한다. webpack-simple에 비해 물어보는 것도 많고 설치되는 것도 많이 있다.

 

webpack-simple에서는 없었던 질문들만 설명하겠다.

# Vue 빌드 선택 
Vue build 

# 두개 중에서 선택할 수 있으며, 기본선택은 Runtime + Compiler다. 

# 대부분의 사용자에게 권장하는 방식. 
- Runtime + Compiler: recommended for most users 

# 6KB의 가벼운 min+gzip으로 이루어져 있는 런타임전용이다. 템플릿은 .vue에서만 허용하고 있다. 
- Runtime-only: about 6KB lighter min+gzip, 
but templates (or any Vue-specific HTML) 
are ONLY allowed in .vue files - render functions are required elsewhere 

# vue-router사용여부 (사용하면 자동으로 설정해준다) 
Install vue-router? (Y/n) 

# ESLint 적용여부 (사용하면 코드작성 스타일을 강제화 한다) 
Use ESLint to lint your code? (Y/n) 

# ESLint 적용하면 나오는 질문으로 어떤 스타일을 사용할 것인지 물어본다. 
Pick an ESLint preset 

# 3개의 선택지가 나오며 기본은 Standard로 되어 있다. 
- Standard (https://github.com/feross/standard) 
- Airbnb (https://github.com/airbnb/javascript) 
- none (configure it yourself) 

# 유닛테스트 Karma, Mocha 적용 여부 
Setup unit tests with Karma + Mocha? (Y/n) 

# Nightwatch 적용 여부 (UI테스트 툴) 
Setup e2e tests with Nightwatch? (Y/n)

 

설치하고 나면 역시 폴더로 들어가서 npm 모듈들을 설치하고 실행해주면 된다.

build 
배포시 관련 설정들이 들어있는 폴더. 

config 
webpack관련 설정들이 포함되어 있는 폴더

package.json 
npm 의존성 모듈 목록들과 개발/테스트/배포할 수 있는 명령어들이 포함되어 있다. 

src 
여기에서 Vuejs로 개발을 진행할 수 있으며
vue-router까지 이미 설정되어 있는 것을 확인할 수 있다. 

static 
Vuejs와 관련없이 정말 공통으로 사용해야할 정적파일들을 이 곳에 보관할 수 있다. 

test 
개발하면서 유닛테스트를 진행할 수 있도록 준비되어 있는 test 폴더다.

# 빌드 후 생성되는 폴더 
dist 
빌드를 완료하게 되면 dist폴더에 모든 파일과 index.html까지 포함되어 있다. 
이 폴더 안에 있는 모든파일을 배포공간에 넣어두면 서비스를 운영할 수 있다.

 

서버 실행

콘솔에서 해당 프로젝트 위치로 이동하고

아래 명령어를 입력해주자.

$npm run dev

 

그리고 http://localhost:8080에 접속해보자.

아래처럼 화면이 나오면 된다.

그러면 설정은 여기까지 하겠다.


WRITTEN BY
Clasha

,

5. v-else 디렉티브

v-if 디렉티브를 사용 했을때 그 아래에 v-else 디렉티브를 사용하는 엘리먼트를 넣어주면,

윗부분의 조건문이 만족하지 않을때 보여진다.

 

html 부분을 다음과 같이 수정해주자.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app">
    <h1 v-if="value > 5">value 가 5보다 크군요</h1>
    <h1 v-else>value 가  5 보다 작아요</h1>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

 

6. v-else-if 디렉티브

v-else-if 는 첫번째 조건문의 값이 참이 아닐 때, 다른 조건문을 체크하여 다른 결과물을 보여줄 수 있게 해준다.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app">
    <h1 v-if="value > 5">value 가 5보다 크군요</h1>
    <h1 v-else-if="value === 5">값이 5네요</h1>
    <h1 v-else>value 가  5보다 작아요</h1>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

v-else-if 는, 언제나 v-if 디렉티브를 사용하는 엘리먼트의 다음위치에 있어야 한다. 만약에 v-else 디렉티브가 사용되는 경우엔 그 사이에 위치해있어야 하며, 이 디렉티브를 여러번 사용해도 된다.

 

7. v-pre 디렉티브

이 디렉티브는 특정 엘리먼트를 무시하는데에 사용 된다. 이걸 사용하므로서, Vue 시스템에서 해당 엘리먼트는 지시문이 없다는걸 인식하게 되어 그 엘리먼트 내부의 자식엘리먼트들을 신경쓰지 않고 그냥 건너뛴다.

이렇게 함으로써, 컴파일 속도가 빨라진다.

이 디렉티브를 사용하면 {{ }} 이런 머스태쉬 태그를 그대로 표시 할 수 있다. 

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app">
    <h1 v-if="value > 5">value 가 5보다 크군요</h1>
    <h1 v-else-if="value === 5">값이 5네요</h1>
    <h1 v-else>value 가  5보다 작아요</h1>
    <h1 v-pre>{{ 이건 그대로 렌더링해줘요 }}</h1>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

 

잘 됐다면, 한번 v-pre 를 없애보자. 그러면 페이지에 아무것도 안나타나게 된다. 콘솔을 열고 Run with JS 를 다시 눌러보면. 컴파일에 실패했다는 오류가 뜨게된다.

오류를 확인했다면 다시 v-pre 디렉티브를 입력하자.

 

8. v-cloak 디렉티브

이 디렉티브에 대해서 알아보기전에, 한번 JSBin 에서 Run With JS 버튼을 여러번 반복해서 눌러보자.

 

이 버튼이 클릭되면서, 자바스크립트가 다시 실행이 되는데. 그 과정에서 가끔씩 숨겨놨던 엘리먼트들이 정말 짧은순간 동안깜박이는 현상이 있다.

그 이유는, 아직 자바스크립트 코드가 실행되기 전이여서 그런데. 한번 그냥 단순히 Auto-run JS 체크박스를 잠깐 설정해제해보자. 자바스크립트가 실행되지 않으니 보여야하지 말아야할게 그대로 보일거다.

지금은 머스태쉬 태그를 작성하지 않았지만, 만약에 템플릿에 머스태쉬 코드를 작성했더라면 그 머스태쉬 태그가 그대로 나타났을거다.

만약에 자바스크립트가 실행 되기전에, 그러니까, Vue 인스턴스가 제대로 준비되기 전 까지 우리의 템플렛을 위한 HTML 코드를 숨기고 싶을 때  v-cloak 이라는 디렉티브를 사용합니다.

HTML 에서 #app 엘리먼트에 v-cloak 디렉티브를 설정해보세요 값 설정은 불필요하고 그냥 추가하기만 하면된다.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app" v-cloak>
      <h1 v-if="value > 5">value 가 5보다 크군요</h1>
      <h1 v-else-if="value === 5">값이 5네요</h1>
      <h1 v-else>value 가  5보다 작아요</h1>
      <h1 v-pre>{{ 이건 그대로 렌더링해줘요 }}</h1>
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

이렇게만 한다고해서, 제대로 적용되지는 않는다. 추가적으로 할 작업이 있는데, CSS 부분에서 해당 attribute 가 있는 경우 display: none 스타일을 적용해야 비로소 숨겨진다.

JSBin 의 상단 CSS 탭을 열어서, 다음과같이 코드를 작성하자.

[v-cloak] {
  display: none;
}

자바스크립트 실행 전
자바스크립트 실행 후

 

9. v-once 디렉티브

이번 포스트에서 마지막으로 다룰 v-once 디렉티브에 대하여 알아보자.

이 디렉티브를 사용하면, 컴포넌트를 초기에 딱 한번만 렌더링한다. 즉, 자바스크립트에서 사용하는 데이터를 사용하긴하는데, 변동이 없고 한결같은 정적인 부분을 보여줄 떄 사용한다.

자 이제 html을 코드를 다음과 같이 수정해보자.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  
  <div id="app" v-cloak>
      <h1 v-once v-if="value > 5">value 가 5보다 크군요</h1>
      <h1 v-else-if="value === 5">값이 5네요</h1>
      <h1 v-else>value 가  5보다 작아요</h1>.
      <h2 v-once>초기 값: {{ value }}</h2>
      <h2>현재 값: {{ value }}</h2>
      <h1 v-pre>{{ 이건 그대로 렌더링해줘요 }}</h1>   
  </div>
  
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
</html>

14번 줄에선 v-once 디렉티브를 사용하여 초기에만 한번 렌더링을 하도록 설정하고, 15번줄에서는 그냥 value 를 그대로 보여주게 했다.

초기 값은 그대로 고정이 되어있고 현재 값은 그때 그떄 업데이트 된다.

앞으로도 4개의 디렉티브가 남았는데, 나머지는 다음에 하나씩 해보도록 하자.


WRITTEN BY
Clasha

,