
Vue에서는 DOM 다루기 편하게 할 수 있도록 디렉티브(Directive)를 지원하는데요. 이번 글에서는 간단하게 어떤 것들이 있는지 보겠습니다.
디렉티브 미리보기
디렉티브
디렉티브(Directive)는 번역하면 지시문이란 뜻으로, Vue에서만 사용하는 특수한 속성입니다.
디렉티브 문법
v-
접두어를 가지고 있어서 기존의 HTML 속성들과 구분을 할 수 있습니다.
html
<태그 v-명칭="값"></태그>
특정 디렉티브(v-for)를 제외하고, 디렉티브에 들어가는 값들은 Javascript 표현식입니다. 콧수염 문법({{}}
)에서처럼요.
html
<태그 v-명칭="count + 1"></태그>
<태그 v-명칭="condition ? 'hello' : 'bye'"></태그>
<태그 v-명칭="myFunc(data)"></태그>
디렉티브 모음
디렉티브의 종류는 다음과 같습니다. 여기서는 간단하게 다루고 앞으로 자세히 하나씩 다뤄보겠습니다.
v-text
: innerText(textContent) 와 동일한 기능으로 vue 데이터 값을 그대로 보여줍니다.html
<p v-text="greet"></p>
<!-- 렌더링 결과 (greet: 'hi')-->
<p>hi</p>
v-html
: innerHTML과 동일한 기능으로 vue 데이터 값을 HTML로 파싱(parsing)해서 보여줍니다.html
<p v-html="html"></p>
<!-- 렌더링 결과 (html: '<h1>안녕하세요</h1>')-->
<p><h1>안녕하세요</h1></p>
v-show
: css display를 조작해 조건에 따라 보여주거나 사라지게 합니다.html
<p v-show="condition"></p>
<!-- 렌더링 결과 (condition: true) -->
<p></p>
<!-- 렌더링 결과 (condition: false) -->
<p style="display: none"></p>
v-if
, v-else-if
, v-else
: v-show처럼 조건에 따라 보여주거나 사라지게 하지만 DOM 자체에서 사라지게 합니다.html
<p v-if="length > 3">length > 3</p>
<p v-else-if="length > 1">length > 1</p>
<p v-else>length <= 1</p>
<!-- 렌더링 결과 (length: 5) -->
<p>length > 3</p>
<!---->
<!---->
<!-- 렌더링 결과 (length: 2) -->
<!---->
<p>length > 1</p>
<!---->
<!-- 렌더링 결과 (length: 0) -->
<!---->
<!---->
<p>length <= 1</p>
v-for
: 하나의 태그를 반복적으로 여러 개 렌더링할 수 있게 해줍니다.html
<p v-for="item of list" :key="item">{{ item }}</p>
<!-- 렌더링 결과 (list: ["A", "B", "C", "D"]) -->
<p>A</p>
<p>B</p>
<p>C</p>
<p>D</p>
v-on
: 이벤트 처리를 하는 용도로 사용합니다.html
<button v-on:click="func">{{ isClick }}</button>
<!--
data() {
return {
isClick: false,
}
},
func() {
this.isClick = !this.isClick;
}
-->
<!-- 렌더링 결과 (클릭 전)-->
<button>false</button>
<!-- 렌더링 결과 (클릭 시)-->
<button>true</button>
v-bind
: Vue의 데이터를 원하는 속성에 원하는 속성값을 넣을 수 있습니다.html
<a v-bind:[attr]="href">링크 글</a>
<!-- 렌더링 결과 (attr: "href", href: "https://naver.com") -->
<a href="https://naver.com">링크 글</a>
v-model
: form의 값들을 양방향 바인딩해줍니다. 즉 input의 값과 데이터 값이 동기화됩니다.html
<input v-model="val" />
<!-- 렌더링 결과 (val: "text") -->
<input /> <!-- text 값이 들어있다. -->
v-slot
: 하위 컴포넌트의 값을 이용해 렌더링하거나 하위 컴포넌트 특정 영역의 DOM을 상위에서 정할 수 있습니다.vue
ChildComp.vue
<header>
<slot name="header"></slot>
</header>
vue
ParentComp.vue
<ChildComp>
<template v-slot:header>
<p>Hi</p>
</template>
</ChildComp>
<!-- 렌더링 결과 -->
<header>
<p>Hi</p>
</header>
v-pre
: Vue로 컴파일 하지 않고 {{ }}
에 상관없이 렌더링합니다.html
<p v-pre>{{ text }}</p>
<!-- 렌더링 결과 -->
<p>{{ text }}</p>
v-cloak
: Vue가 컴파일 되기전에 나타나는 {{ }}
를 숨겨주다가 끝나면 보여줍니다.html
<p v-cloak>{{ text }}</p>
<!-- 렌더링 결과 (text: "hello") -->
<p>hello</p>
v-once
: 한 번 렌더링하면 이후 데이터가 바뀌더라도 DOM을 렌더링하지 않습니다.html
<p v-once>{{ text }}</p>
<!-- 렌더링 결과 (text: "hello") -->
<p>hello</p>
<!-- text값이 중간에 바뀐 렌더링 결과 (text: "bye") -->
<p>hello</p>
v-memo
: v-memo에 들어있는 값이 업데이트 될 때만 다시 렌더링 해줍니다.html
<button v-on:click="count++">{{ count }}</button>
<button v-on:click="update = !update">update</button>
<p v-memo="[update]">{{ count }}</p>
<!-- count : 0, update : false -->
<!-- 렌더링 결과 (클릭 전) -->
<button>0</button>
<button>false</button>
<p>0</p>
<!-- count 클릭 -->
<button>1</button>
<button>false</button>
<p>0</p>
<!-- update 클릭 -->
<button>1</button>
<button>true</button>
<p>1</p>
커스텀 디렉티브
Vue에서 제공하는 기본적인 디렉티브 뿐만 아니라 특정 기능을 수행하는 커스텀 디렉티브도 만들 수 있습니다.
html
<태그 v-mydirective></태그>