v-if 다음 v-else-if 다음 v-else
true라는 값을 가져야지만 화면에 렌더링 해준다. false는 렌더링 하지 않음
<template>
<button @click="handler">
Click me!
</button>
<h1 v-if="isShow">
Hello?!
</h1>
<h1 v-else-if="count > 3">
Count > 3
</h1>
<h1 v-else>
good~
</h1>
</template>
<script>
export default {
data() {
return {
isShow: true,
count: 0
}
},
methods: {
handler() {
this.isShow = !this.isShow
this.count += 1
}
}
}
</script>
<style>
</style>
div와 다른 점: button 아래 특정 태그로 감싸져있지 않고 바로 button 아래에 나타남
주의점:v-if
를 최상위template
태그에 갖다놓으면 적용 되지 않음
<template>
<button @click="handler">
Click me!
</button>
<template v-if="isShow">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
</template>
<script>
export default {
data() {
return {
isShow: true,
count: 0
}
},
methods: {
handler() {
this.isShow = !this.isShow
this.count += 1
}
}
}
</script>
<style>
</style>
구조적인 렌더링은 하지만,
display
가none
으로 뜬다! 둘의 차이는v-show
를 쓴 엘리먼트의 경우,항상 렌더링
되어 DOM(HTML)에 남아있다는 점.v-show
는 단순히 엘리먼트의CSS display 속성
만을 전환.
<template>
<button @click="handler">
Click me!
</button>
<h1 v-show="isShow">
Hello?!
</h1>
</template>
<script>
export default {
data() {
return {
isShow: false,
count: 0
}
},
methods: {
handler() {
this.isShow = !this.isShow,
this.count += 1
}
}
}
</script>
<style>
</style>
v-if는 "실제(real)" 조건부 렌더링입니다. 전환 도중 조건부 블록 내부의 이벤트 리스너 및 자식 컴포넌트들이 올바르게 제거되고 다시 생성되기 때문입니다.
또한 v-if는 게으릅니다(lazy). 초기 렌더링 시, 조건이 거짓(false)이면 아무 작업도 하지 않습니다. 조건부 블록은 조건이 처음으로 참(true)이 될 때까지 렌더링되지 않습니다.
이에 비해 v-show는 훨씬 간단합니다. 엘리먼트는 CSS 기반 전환으로 초기 조건과 관계 없이 항상 렌더링됩니다. (역자 주: v-show는 엘리먼트를 DOM에 우선 렌더링하고 조건에 따라 CSS display:block/display:none 속성을 전환합니다.)
일반적으로 v-if는 전환 비용이 높은 반면, v-show는 초기 렌더링 비용이 높습니다. 그러므로 무언가를 자주 전환해야 한다면 v-show를 사용하는 게 좋고, 런타임 시 조건이 변경되지 않는다면 v-if를 사용하는 게 더 낫습니다.
v-if
를 먼저 사용하고, 사용자가 많이 토글을 한다면v-show
로 바꾸는 방향으로!