: v-
접두사로 시작하며 Vue.js에서 엘리먼트에 사용되는 특별한 속성
Vue 인스턴스의 데이터와 DOM 요소를 연결하여 DOM이 반응적으로 동작할 수 있도록 한다.
v-text
: 요소의 textContent
속성을 변경하는 디렉티브
<!-- HTML -->
<div id="app">
<p v-text="message"></p> <!-- data에 있는 message와 동적 바인딩 -->
</div>
// js
new Vue({
el: '#app',
data: {
message: '안녕하세요, Vue.js!'
}
})
v-html
: 요소의 innerHTML
속성을 변경하는 디렉티브
HTML 요소의 내용을 Vue 인스턴스의 데이터에 있는 HTML마크업으로 동적으로 바인딩할 수 있다.
= Vue 데이터 포함된 HTML 코드를 렌더링할 수 있다.
<!-- HTML -->
<div id="app">
<p v-html="htmlContent"></p> <!-- data에 있는 htmlContent와 동적 바인딩 -->
</div>
// js
new Vue({
el: '#app',
data: {
htmlContent: '<strong>이 텍스트는 강조됩니다.</strong>'
}
})
하지만 v-html을 사용할 때는 보안상의 이슈에 주의해야 한다.
사용자 입력을 포함한 데이터를 v-html에 직접 삽입하는 경우, 크로스 사이트 스크립팅(XSS) 공격과 같은 보안 문제가 발생할 수 있으므로 신뢰할 수 없는 데이터를 사용할 때 조심해야 한다.
v-show
: 표현식의 truthy/falsy 값을 기반으로 엘리먼트를 보여주거나(display: visible
) 숨기는(display: none
) 디렉티브
display
를 토글한다.<!-- HTML -->
<div id="app">
<p v-show="isVisible">이 요소는 조건이 true일 때만 표시됩니다.</p>
</div>
// js
new Vue({
el: '#app',
data: {
isVisible: true // true일 때는 요소가 표시됨, false일 때는 숨김
}
})
v-if
: 표현식의 truthy/falsy 값을 기반으로 엘리먼트를 렌더링하는 디렉티브
<!-- HTML -->
<div id="app">
<p v-if="isVisible">이 요소는 조건이 true일 때만 표시됩니다.</p>
</div>
// js
new Vue({
el: '#app',
data: {
isVisible: true // true일 때는 요소가 표시됨, false일 때는 DOM에서 제거됨
}
})
v-if
와v-show
를 언제 사용해야하는가?
v-else-if
: v-if
와 함께 조건부 렌더링을 구현하는 else if
역할을 하는 디렉티브
v-if
또는 v-else-if
가 있어야 한다.<template>
에서 텍스트 또는 여러 엘리먼트를 포함하는 조건부 블록을 나타내는 데 사용할 수 있다.v-else
: v-if
또는 v-else-if
와 함께 조건부 렌더링을 구현하는 else
역할을 하는 디렉티브
v-if
또는 v-else-if
가 있어야 한다.<!-- HTML -->
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
A/B/C 가 아니야!
</div>
v-for
: 반복 가능한 데이터를 기반으로 엘리먼트 또는 <template>
블록을 여러 번 렌더링하는 디렉티브
v-for
디렉티브는 반복문에서 현재값에 별칭(alias)을 제공하기 위해, 특수 문법인 alias in expression
(표현식 내 별칭)을 사용해야 한다.<!-- HTML -->
<div id="app">
<ul>
<li v-for="item in items">{{ item }}</li>
</ul>
</div>
// js
new Vue({
el: '#app',
data: {
items: ['사과', '바나나', '체리', '딸기']
}
})
<!-- HTML -->
<div id="app">
<ul>
<li v-for="(value, key) in person">{{ key }}: {{ value }}</li>
</ul>
</div>
// js
new Vue({
el: '#app',
data: {
person: {
name: 'Alice',
age: 30,
profession: 'Engineer'
}
}
})
v-on
: 엘리먼트에 이벤트 리스너를 연결하는 디렉티브
@
:
)로 이벤트 타입을 전달해야 한다. v-on:[event]
<!-- HTML -->
<div id="app">
<button v-on:click="showMessage">클릭하세요</button>
<!-- <button @click="showMessage">클릭하세요</button> 단축 문법 -->
</div>
// js
new Vue({
el: '#app',
methods: { // methods 객체에 함수를 정의할 수 있다.
showMessage: function () {
alert('버튼이 클릭되었습니다!');
}
}
})
.stop
- event.stopPropagation()
호출.prevent
- event.preventDefault()
호출.capture
- 캡처 모드로 이벤트 등록.self
- 이벤트가 이 엘리먼트에서 전달된 경우에만 트리거 됨.{keyAlias}
- 이벤트가 특정 키에 대해서만 트리거 됨.once
- 이벤트가 한 번만 트리거 됨.left
- 마우스 왼쪽 버튼으로만 이벤트가 트리거 됨.right
- 마우스 오른쪽 버튼으로만 이벤트가 트리거 됨.middle
- 마우스 중앙(휠 클릭) 버튼으로만 이벤트가 트리거 됨.passive
- { passive: true }
옵션으로 DOM 이벤트를 등록<div id="app">
<button @click.once="showMessage">한 번만 실행됩니다.</button>
</div>
v-bind
: 엘리먼트의 속성값을 동적으로 바인딩하는 디렉티브
:
v-bind
디렉티브는 다양한 HTML 속성에 사용할 수 있으며, href
, src
, alt
, class
, style
, disable
등의 속성을 동적으로 설정할 수 있다.<!-- HTML -->
<div id="app">
<a v-bind:href="url">Vue.js 공식 웹사이트</a>
<!-- <a :href="url">Vue.js 공식 웹사이트</a> 단축 문법 -->
</div>
// js
new Vue({
el: '#app',
data: {
url: 'https://vuejs.org/'
}
})
v-model
: 사용자 입력을 받는 form 엘리먼트 또는 컴포넌트에 양방향 바인딩을 만드는 디렉티브
<input>
, <select>
, <textarea>
, 컴포넌트에만 사용할 수 있다.v-model
디렉티브를 사용하면 입력된 데이터가 Vue 데이터와 동기화되며, 데이터가 변경될 때 입력 요소도 업데이트된다.<!-- HTML -->
<div id="app">
<input v-model="message" placeholder="메시지를 입력하세요">
<p>입력한 메시지: {{ message }}</p>
</div>
// js
new Vue({
el: '#app',
data: {
message: ''
}
})
위의 예시에서 message
데이터는 초기에 빈 문자열로 초기화되어 있고, 사용자가 <input>
요소에 텍스트를 입력하면 message
데이터와 자동으로 값이 동기화되며 입력한 내용이 화면(<p>
)에 표시된다.
.lazy
- change 이벤트 대신 input 이벤트를 수신함 (사용자가 입력할 때마다 데이터가 업데이트되는 것이 아닌 사용자가 입력을 완료한 후에 데이터를 업데이트하고 싶을 때 사용).number
- 입력 문자열을 숫자로 변환하여 전달.trim
- 사용자 입력의 공백을 트리밍<div id="app">
<input v-model.number="age" type="text" placeholder="나이를 입력하세요">
<p>나이: {{ age }}</p>
</div>
뷰를 보면서 생소한 느낌은 강하지만 직관적인거 같아요!