Vue.js 는 선언적 렌더링 방식이다.
<script src="https://unpkg.com/vue"></script>로 임포트 하면 바로 사용이 가능하다.
라이프사이클이 존재한다.
직관적이다. 그래서 속도가 빠르다.
선언적 렌더링
<div id="app"> {{ message }} </div>
|
var app = new Vue({ el: '#app', data: { message: '안녕하세요 Vue!' } })
|
Vue의 간단한 템플릿 구문이다.
{{}}은 Vue의 보간자이다. 검색해보니 Mustache 템플릿 인거같다.
태그(앨리먼트) 속성을 바인딩 할 수 있다.
<div id="app-2"> <span v-bind:title="message"> 내 위에 잠시 마우스를 올리면 동적으로 바인딩 된 title을 볼 수 있습니다! </span> </div>
|
var app2 = new Vue({ el: '#app-2', data: { message: '이 페이지는 ' + new Date() + ' 에 로드 되었습니다' } })
|
여기서 v-bind는 디렉티브라고 한다.
v는 vue의 줄임말이다.
조건문과 반복문
조건문과 반복문도 아주 쉽게 사용할 수 있다.
<div id="app-3"> <p v-if="seen">이제 나를 볼 수 있어요</p> </div>
|
var app3 = new Vue({ el: '#app-3', data: { seen: true } })
|
js부분의 seen을 false로 바꾸면 p 태그가 출력이 안된다.
<div id="app-4"> <ol> <li v-for="todo in todos"> {{ todo.text }} </li> </ol> </div>
|
var app4 = new Vue({ el: '#app-4', data: { todos: [ { text: 'JavaScript 배우기' }, { text: 'Vue 배우기' }, { text: '무언가 멋진 것을 만들기' } ] } })
|
foreach를 이용한것 같다.
todo는 todos안에 있는 JSON Data를 차례대로 넣어준다.
app4.todos.push({ text: 'New item' }) New item도 추가된다.
사용자 입력 핸들링
v-on 디렉티브를 이용해서 이벤트 리스너를 첨부한다.
<div id="app-5"> <p>{{ message }}</p> <button v-on:click="reverseMessage">메시지 뒤집기</button> </div>
|
var app5 = new Vue({ el: '#app-5', data: { message: '안녕하세요! Vue.js!' }, methods: { reverseMessage: function () { this.message = this.message.split('').reverse().join('') } } })
|
reverseMessage는 말 그대로 문자열을 뒤집는다.
이 메소드는 DOM을 건드리지 않고 앱의 상태를 업데이트 한다.
Vue는 또한 양식에 대한 입력과 앱 상태를 양방향으로 바인딩하는 v-model
디렉티브를 제공합니다.
<div id="app-6"> <p>{{ message }}</p> <input v-model="message"> </div>
|
var app6 = new Vue({ el: '#app-6', data: { message: '안녕하세요 Vue!' } })
|
input에 아무값을 입력하면 p태그안에 값이 입력된다.
작동 순서는 input 입력 -> data.message에 대입 -> p태그에 출력
컴포넌트를 사용한 작성방법
컴포넌트는 Vue에서 중요한 기능이라한다.
재사용을 가능하게 한다. (구조 -> 블럭화)
컴포넌트 생성 방법이다.
Vue.component('todo-item', { template: '<li>할일 항목 하나입니다.</li>' })
|
todo-item은 태그네임이다.
<ol>
<todo-item></todo-item>
</ol>
이런식으로 사용 가능하다.
props를 사용해서 하위 컴포넌트로 데이터를 전달도 가능하다.
Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' })
|
<div id="app-7">
<ol>
<todo-item v-for="item in groceryList" v-bind:todo="item"></todo-item>
</ol>
</div>
groceryList를 나눠서 item으로 전달해주고 todo값에 item을 넣어준다.
그러면 script부분에서 props(todo)의 text를 불러와 적용시킨다.
v-bind
사용방법:
동적으로 하나 이상의 컴포넌트 속성 또는 표현식을 바인딩 합니다.
class
또는 style
속성을 묶는 데 사용될 때, Array나 Objects와 같은 추가 값 유형을 지원합니다. 자세한 내용은 아래 링크된 섹션을 참조하십시오.
속성 바인딩에 사용할 때 속성은 하위 컴포넌트에서 올바르게 선언되어야 합니다.
전달인자 없이 사용하면 속성 이름 - 값 쌍을 포함하는 객체를 바인딩 하는데 사용할 수 있습니다. 이 모드에서는 class
와 style
은 Array나 Objects를 지원하지 않습니다.
예제:
<img v-bind:src="imageSrc"> <img :src="imageSrc"> <img :src="'/path/to/images/' + fileName"> <div :class="{ red: isRed }"></div> <div :class="[classA, classB]"></div> <div :class="[classA, { classB: isB, classC: isC }]"> <div :style="{ fontSize: size + 'px' }"></div> <div :style="[styleObjectA, styleObjectB]"></div> <div v-bind="{ id: someProp, 'other-attr': otherProp }"></div> <div v-bind:text-content.prop="text"></div> <my-component :prop="someThing"></my-component> <child-component v-bind.prop="$props"></child-component> <svg><a :xlink:special="foo"></a></svg>
|
.camel
수식어는 DOM 템플릿을 사용할 때 v-bind
속성 이름을 camelCase화 할수 있습니다. (예: SVG viewBox
속성)
<svg :view-box.camel="viewBox"></svg>
|
문자열 템플릿을 사용하거나 vue-loader
/vueify
로 컴파일 하는 경우 .camel
은 필요 없습니다.
참고:
<div id="app"> <app-nav></app-nav> <app-view> <app-sidebar></app-sidebar> <app-content></app-content> </app-view> </div>
|
템플릿을 사용하면 이런식으로 쪼갤 수 있다.