Week 7. 신세계 Vue 탐험 (2)
클래스/스타일 바인딩, v-if, v-show, v-cloak, 리스트렌더링, 이벤트핸들링
여러 개의 클래스(스타일)
를 달고 싶을 경우,<!--HTML-->
<h1 :class="{ 넣을 클래스: 데이터 속성, 넣을 클래스(2): 데이터 속성(2) }"></h1>
// JS
const App = {
data() {
return {
데이터속성: false,
데이터속성(2): true
}
}
}
v-on에 여러 개의 이벤트
를 달고 싶은 경우,
메서드를 실행하고 ;
으로 마무리 해줘야 함.
(Vue.js 3 버전에선 ,
로도 가능)
<h1 @click="toRed(); increase()"></h1>
<h1 @click="toRed(), increase()"></h1> <!--Vue.js 3 버전-->
v-if
, v-else-if
,v-else
디렉티브 사용<h1 v-if="isShow">Hi</h1>
<template v-else-if="{}"> <!--template 태그는 렌더링되지 않음-->
<a href="">1</a>
<a href="">2</a>
<a href="">3</a>
</template>
<h1 v-else>Etc</h1> <!--isShow가 falsy일 때 렌더링-->
⭐️ template
태그는 렌더링되지 않고 내용물만 렌더링됨.
v-show
태그로 display:none을 줬다 풀었다 할 수 있음.{{}}
의 텍스트가 일시적으로 보일 수 있음!!v-cloak
도 함께 사용해주기v-cloak
: DOM 요소가 렌더링되기 전까지 해당 요소를 display:none 함.<!--HTML-->
<style>
[v-cloak] {
display: none;
}
<style>
<h1 v-if="isShow" v-cloak>{{ txt }}</h1>
// JS
const App = {
data() {
return {
txt: 'Hi!',
isShow: true
}
}
}
v-if VS v-show
v-if
:조건이 false일 땐 해당 요소를 html에 구조적으로 만들지 않음.
👉🏻 초기 렌더링 비용이 낮음. 전환 비용이 높음
v-show
: 조건이 false일 떈 해당 요소를 html에 구조적으로 만들고,
display 속성을 none으로 줌.
👉🏻 초기 렌더링 비용이 높음. 전환 비용이 낮음
😉 우선적으로v-if
를 사용 후, 전환비용이 높을 때v-show
로 교체
참고) v-if와 v-for 같이 사용하지 말기
- v-if가 더 높은 우선순위를 가짐.
- template 태그로 두 디렉티브를 분리해 사용
value, key, index
이 순서로 들어온다.<li v-for="(value, key, index) in object">
{{ value }}
</li>
Object.keys()
키 나열 순서를 구현하며 일관적이지 않다.v-for
로 정수를 반복할 경우, index는 1부터 시작한다.<li v-for="n in 10">
{{ n }} <!--1 ~ 10-->
</li>
v-for
와 단짝인 key
key
속성으로 Vue가 최적화과정을 진행할 수 있도록 돕자.<li v-for="item in lists" :key="item.id">
</li>
👉🏻 또한 key
는 요소가 고유함을 나타낼 때 사용할 수 있다!
순서에 상관없이 이벤트 객체 받기: $event
<!--html-->
<h1 @click="method('first', $event)"></h1>
// JS
const App = {
methods: {
method(first, event) {
console.log(first, event)
}
}
}
.self
currentTarget === target이 같을 때만 실행
.passive
화면의 렌더링과 로직의 동작을 분리해서 처리.
👉🏻 모바일 환경에서 잘 활용됨!
<input @keyup.enter="submit"/> <!--키가 enter일 경우만 실행-->
<input @keyup.alt.enter="clear"/> <!--키가 alt랑 enter를 누를 경우만 실행-->
.meta
=== cmd
⚠️ meta는 keyup
이벤트가 아닌 key-down
이벤트에만 작동
exact
정확한 조합을 눌렀을 때만 실행
<form>
<input :value="txt"/>
</form>
const App = {
data() {
return {
txt: ''
}
}
}
단방향 데이터 바인딩
: 한쪽에서만 데이터를 변경할 수 있을 때 ex) v-bind
양방향 데이터 바인딩
: 양쪽에서 데이터를 변경할 수 있음. ex) v-model
<form>
<h1>{{ txt }}</h1>
<input v-model="txt"/>
</form>
⚠️ v-model은 한글을 실시간으로 반영하지 못함.
<!--HTML-->
<main class="app">
<input :value="txt" @input="txt = $event.target.value"/>
<h1 >{{ txt }}</h1>
</main>
// JS
const App = {
data () {
return {
txt: 'Hello Vue!'
}
}
}
const app = Vue.createApp(App).mount('.app');
따라서 한글로 양방향 데이터 바인딩을 할 땐 위와 같이 이벤트를 활용할 것.
<!--HTML-->
<main class="app">
<input v-model="checked" type="checkbox" value="a"> <!--✅-->
<input v-model="checked" type="checkbox" value="b"> <!--✅-->
<input v-model="checked" type="checkbox" value="c"> <!--✅-->
</main>
// JS
const App = {
data () {
return {
checked: [] // [{0: a}, {1: b}, {2: c}]
}
}
}
const app = Vue.createApp(App).mount('.app');
체크박스에 체크된 value가 배열요소로 들어감.
.lazy
<!--HTML-->
<input v-model.lazy="txt">
@input 이벤트가 아닌 @change 이벤트(e.g, enter 등) 이후에
txt 데이터가 동기화 됨.
(뒤늦게 데이터가 갱신됨)
잘봤습니다!