문자열(Text)
데이터 바인딩의 가장 기본 형태는 Mustache 구문(이중 중괄호) 을 사용한 텍스트 보간이다.
<span>Message: {{ msg }}</span>
v-once
디렉티브를 사용하여 데이터 변경 시,<span v-once>This will never change: {{ msg }}</span>
원시 HTML(Raw HTML)
Mustache 태그는 HTML이 아닌 일반 텍스트로 데이터를 해석한다.
실제 HTML을 출력하려면 v-html
디렉티브를 사용해야 한다.
var rawHtml = <span>This should be red.</span>
<p>{{ rawHtml }}</p>
<!-- output : <span>This should be red.</span> -->
<p><span v-html="rawHtml"></span></p>
<!-- output : This should be red. -->
웹사이트에서 임의의 HTML을 동적으로 렌더링하려면 XSS 취약점으로 쉽게 이어질 가능 성이 있기 때문에 사용을 지양해야 한다.
속성(Attributes)
Mustache는 HTML 속성에서 사용할 수 없다.
대신 v-bind
디렉티브를 사용한다.
<div v-bind:id="dynamicId"></div>
v-bind
는 조금 한다.<button v-bind:disabled="isButtonDisabled">Button</button>
isButtonDisabled
가 null, undefined, false 값을 가지면 disaled 되었기 때문에 랜더링 된 <button>
엘리먼트에 속성이 포함되지 않는다.JavaScript 표현식 사용(Using JavaScript Expressions)
Vue.js는 모든 데이터 바인딩 내에서 JavaScript 표현식의 모든 기능을 지원한다.
(Vue에서 사용 가능한 JavaScript 표현식)
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id"></div>
{{ var a = 1 }}
{{ if (ok) { return message } }}
디렉티브 (Directives)
v- 접두사가 있는 특수 속성이다.
디렉티브 속성 값은 단일 JavaScript 표현식이 된다. (v-for
제외)
표현식의 값이 변경될 때 사이드이펙트를 반응적으로 DOM에 적용하는 역할을 한다.
v-if
디렉티브는 seen 변수의 boolean 값에 기반하여 <p>
엘리먼트를 제거 또는 삽입<p v-if="seen">Now you see me</p>
v-bind
디렉티브는 반응적으로 HTML 속성 갱신에 사용된다.<a v-bind:href="url"> ... </a>
<!-- 전달인자 : href -->
<a v-on:click="doSomething"> ... </a>
<!-- 전달인자 : click -->
동적 전달인자의 형식 제약
에도 나와있듯 조금의 제약이 있다.<a v-bind:[attributeName]="url"> ... </a>
<!-- attributeName이 "href"라고 한다면 v-bind:href 와 동등하다. -->
<a v-on:[eventName]="doSomething"> ... </a>
<!-- eventName이 "focus"라고 한다면 v-on:focus 와 동등하다. -->
- 동적인자 값의 제약<!-- 컴파일러 경고 -->
<a v-bind:['foo' + bar]="value"> ... </a>
in-DOM 템플릿을 사용할 때에는, 브라우저가 모든 속성명을 소문자로 만드는 관계로 대문자 사용을 피하는 것이 좋다.<!-- in-DOM 템플릿에서는 이 부분이 v-bind:[someattr]로 변환된다.
인스턴스에 "someattr" 속성이 없는 경우, 이 코드는 동작하지 않는다. -->
<a v-bind:[someAttr]="value"> ... </a>
.prevent
수식어는 트리거된 이벤트에서 event.preventDefault()
를 호출하도록 v-on 디렉티브에게 알려준다.<form v-on:submit.prevent="onSubmit"> ... </form>