지난 포스트에서 템플릿 문법을 설명하면서 화면을 조작하는 방법에 데이터 바인딩
과 디렉티브
가 있다고 했었습니다. 그리고 디렉티브
에 대해선 간략하게 설명만 하고 넘어갔죠.
오늘은 Vue에서 기본적으로 제공하고 있는 빌트인 디렉티브
에 대해서 알아보도록 하겠습니다.
v-
접두사를 사용해서 표현한 속성들을 디렉티브
라고 부릅니다. 디렉티브를 사용하면 화면 조작을 편리하게 할 수 있다는 장점이 있습니다. 그리고 뷰에서는 몇 가지 디렉티브들을 기본적으로 제공하고 있는데 이들을 빌트인 디렉티브
라고 부르며 그 종류는 아래와 같은 것들이 있습니다.
디렉티브
에는 속성값이 오는데, 이 속성값은 단일 자바스크립트 표현식이 와야합니다. (v-for, v-on, v-slot
은 예외입니다.) 디렉티브는 이 속성값이 변경될 때 DOM 요소를 업데이트하게 됩니다.
디렉티브는 다음과 같은 구조를 갖습니다.
이름
이름은 사용하고자 하는 디렉티브의 이름입니다.
인수
어떤 디렉티브는 이름 뒤에 콜론 :
으로 인수를 표기할 수 있습니다. 대괄호 []
를 이용하면 동적으로 인수를 만들 수도 있습니다. 동적 인수는 컴포넌트 인스턴스에서 결정됩니다.
수식어
수식어는 점 .
으로 시작하는 접미사입니다. 디렉티브가 특정 방식으로 바인딩되기를 원할 때 사용하여 나타냅니다.
이제 위에서 소개했던 빌트인 디렉티브
의 몇 가지를 살펴보도록 하겠습니다.
여기서는 빌트인 디렉티브의 종류와 기본적인 내용 그리고 사용법을 다룹니다. 설명이 부족한 몇몇 빌트인 디렉티브에 대해서는 연관 내용과 함께 더 자세하게 다시 다룰 예정입니다.
요소의 텍스트 콘텐츠를 업데이트합니다. 값으로는 string
타입을 받습니다.
v-text
는 기존 컨텐츠를 완전히 덮어씌웁니다. 따라서 일부분만 업데이트하고 싶다면 이중 중괄호
문법을 사용해야합니다.
<span v-text='str'></span>
<!--아래 문법과 동일-->
<span>{{str}}</span>
요소의 innerHTML
을 업데이트합니다. 값으로는 string
타입을 받습니다.
v-html
의 값은 HTML로 삽입됩니다.
HTML의 동적 삽입은
XSS 공격
에 취약하기 때문에v-html
의 사용보다는 컴포넌트의 렌더링을 이용하는 것이 권장됩니다.XSS, Cross Site Scripting
웹의 취약점 공격 방식으로, 권한이 없는 사용자가 웹 페이지에 스크립트를 삽입하여 공격하는 방식을 의미합니다.
<div v-html='html'></div>
scoped
속성이 적용된<style>
은 v-html의 요소들에게는 적용되지 않습니다.
표현식에 truthy한 값
이 전달되면 요소를 렌더링합니다.
v-show
가 설정된 요소는 true이던 false이던 항상 브라우저에 렌더링이 되어 있습니다. 내부적으로 CSS의 display
옵션을 건들며 요소가 보여질지 말지를 결정합니다.
<div v-show='flag'>v-show 조건부 렌더링</div>
v-if
는 우리가 일반적으로 사용하던 if구문처럼 표현식이 true이면 렌더링을 하고, false이면 렌더링을 하지 않습니다.
이때 v-show와의 차이점은 이미 언급했지만,
v-show
는 표현식 값이 어쨋든간에 브라우저에 렌더링을 하고 CSS의display
속성을 조절하며 보여지고 안보여지는지를 결정합니다.반면에
v-if
는 표현식이 truthy하면 요소를 렌더링하고, falsy하면 렌더링 자체를 하지 않습니다.
v-else
는 v-if
와 함께 오는 else 체인입니다.
v-else-if
또한 v-if
와 함께 사용하는 체인입니다.
<div v-if="x === 'A'">x는 A</div>
<div v-else-if="x === 'B'">x는 B</div>
<div v-else>x는 A도 B도 아님</div>
소스 데이터를 기반으로 요소나 템플릿 블록을 반복 렌더링합니다. 배열, 객체, number, string, 반복자
를 값으로 받습니다.
반복 요소의 현재 값에 별칭을 부여하기 위한 alias in expression을 사용합니다.
<div v-for='elem in arr'>현재 요소: {{elem}}</div>
v-on
은 요소에 이벤트 리스너를 연결하는 디렉티브입니다. 위에서 언급했던 인수
와 수식어
를 사용합니다.
이벤트 타입을 인수로 표현합니다.
<요소 v-on:이벤트_종류.수식어='이벤트_리스너'></요소>
<!--수식어는 선택사항-->
수식어로는 다음과 같은 것들이 올 수 있습니다.
event.stopPropagation()
은 이벤트의 버블링을 방지합니다. (부모 요소로의 이벤트 전파를 막음)event.preventDefault()
는 요소의 기본 동작을 막습니다. (a태그의 링크 이동이라던가 submit 버튼의 새로고침 효과라던가){passive: true} 옵션
은 브라우저에게 요소의 기본 동작을 막지 않음을 선언하는 옵션입니다. (주로 터치 이벤트와 스크롤에서 사용)
v-on
은 디렉티브 표기대신에 @
로 단축해서 사용할 수도 있습니다.
<button v-on:click='onClick'></div>
<!-- @ 단축 구문-->
<button @click='onClick'></div>
<button @click.prevent='onClick'></div>
v-bind
는 하나 이상의 속성이나 컴포넌트 props를 표현식에 동적 바인딩합니다.
v-bind
의 수식어는 다음과 같습니다.
kebab-case는 케밥 꼬치에 고기를 꽂은 모양이라 해서 이름 붙여진 명명법입니다.
vue-practice
,user-information-system
과 같은 명명 방식입니다.
v-bind
도 단축 문법을 제공하고 있습니다. 콜론 :
으로 단축이 가능합니다.
<!--속성 바인딩, 속성에 src가 있다고 가정-->
<img v-bind:src='src'></img>
<!--단축 문법 속성 바인딩-->
<img :src='src'></img>
<!--prop 바인딩-->
<ChildComponent :prop='data' />
바인딩은 여러 용도로 다양하게 사용됩니다. 참조
본격적으로 바인딩에 대한 내용에 들어가면 다시 한 번 더 v-bind를 정리할 예정입니다.
사용자 입력을 받는 form 요소나 컴포넌트에 대해 양방향 바인딩
을 만들어주는 디렉티브입니다. 컴포넌트, <input>, <textarea>, <select>
에 사용할 수 있습니다.
수식어는 다음과 같습니다.
추후에 form 요소, form 입력 바인딩에 대한 내용과 함께 더 자세한 설명 포스트를 만들 예정입니다.
이름이 있는 슬롯이나 props를 받을 것으로 예상되는 scoped를 나타냅니다. <template>
나 컴포넌트에서만 사용할 수 있습니다.
추후에 slot 개념과 함께 더 자세한 설명 포스트를 만들 예정입니다.
현재 요소와 모든 자식 요소의 컴파일을 생략합니다. 이 디렉티브는 표현식을 사용하지 않습니다.
이중 중괄호 태그를 표시하고자 하는 상황에서 주로 사용합니다. (컴파일하면 문법 표현이 되므로)
<div v-pre>{{ 이 내용은 컴파일되지 않습니다. }}</div>
요소와 컴포넌트를 한 번만 렌더링하고 이후의 업데이트를 하지 않습니다. 역시 표현식을 사용하지 않습니다.
<div v-once>str이 변경되어도 업데이트되지 않습니다.: {{str}}</div>
템플릿의 하위 트리를 메모합니다. 값으로는 배열을 받는데, 이 배열의 모든 값이 마지막 비교 값과 변함이 없다면 업데이트를 생략합니다. (즉, 메모(메모제이션)은 렌더링 최적화)
<div v-memo='[value1, value2]'></div>
준비될 때까지 컴파일되지 않은 템플릿을 숨깁니다. 표현식을 사용하지 않습니다. 빌드 과정을 사용하지 않는 경우에만 사용하는 디렉티브입니다.
<div v-cloak>컴파일이 완료되지 않으면 표시되지 않음</div>