Vue 条件渲染 v-if 和 条件展示 v-show
在 Vue 中 v-show 和 v-if 都能实现元素的显示或隐藏,但是两个指令还是有些不一样的。这里就简单写一下 v-show 和 v-if 两个指令的区别和用法。
v-show
v-show 的功能是条件展示,如果条件为 true 就显示,否则就隐藏。v-show 的显示和隐藏主要是更改 CSS 的 display 属性,并不会重新渲染或删除元素。
使用方法
<template>
<div id="app">
<button type="button" @click="boxShow = !boxShow">显示/隐藏</button>
<div class="box" v-show="boxShow"></div>
</div>
</template>export default {
name: 'app',
data () {
return {
boxShow: true
}
}
}div 的 v-show 绑定了 data 中的 boxShow,boxShow 为 true div 就会显示,为 false div 会隐藏。所以只要改变 boxShow 就能让 div 显示或隐藏。
效果如下:

下面是 v-show 的 DOM 变化:

可以看到如果条件为 false style 就会加入 display: none。
使用场景
v-show 无论初始值为 true 还是 false 元素都会被渲染,显示和隐藏也只是更改 display。比较适合用在一些需要平凡切换显示和隐藏的场景,例如对话框之类的。
v-if
v-if 的功能是条件渲染,只有条件为 true 才会渲染。如果 v-if 的初始值为 false ,元素就不会渲染。如果中途改变 v-if 的值为 false ,元素会被删除。
使用方法
<template>
<div id="app">
<button type="button" @click="boxShow = !boxShow">显示/隐藏</button>
<div class="box" v-if="boxShow"></div>
</div>
</template>export default {
name: 'app',
data () {
return {
boxShow: true
}
}
}v-if 绑定了 boxShow ,如果 boxShow 为 true div 就会被渲染,否则 div 就会被删除。v-if 的用法和 v-show 是差不多的。
v-if 的外观效果和 v-show 差不多,下面是 v-if 的 DOM 变化:

可以看到如果条件为 false 元素会被直接删除,如果条件为 true 元素会被重新渲染。
配合 v-else 使用
v-else 需要配合 v-if 使用,如果条件为 true 就渲染 if 元素,否则就渲染 v-else 元素。
用法如下:
<template>
<div id="app">
<button type="button" @click="box1 = !box1">切换box</button>
<div class="box" v-if="box1">box1</div>
<div class="box" v-else>box2</div>
</div>
</template>export default {
name: 'app',
data () {
return {
box1: true
}
}
}上面的代码只要 v-if 的条件为 true 就会渲染第一个 div,否则就渲染第二个 div。
注意!v-else 元素必须紧跟在 v-if 元素的后面,否则将不会被识别。
效果如下:

配合 v-else-if 使用
v-else-if 也需要配合 v-if 使用,可以做连续判断。
用法如下:
<template>
<div id="app">
<button type="button" @click="type = 'A'">A</button>
<button type="button" @click="type = 'B'">B</button>
<button type="button" @click="type = 'C'">C</button>
<button type="button" @click="type = ''">无</button>
<div class="box" v-if="type === 'A'">A</div>
<div class="box" v-else-if="type === 'B'">B</div>
<div class="box" v-else-if="type === 'C'">C</div>
<div class="box" v-else>无</div>
</div>
</template>export default {
name: 'app',
data () {
return {
type: 'A'
}
}
}上面的 v-if 和 v-else-if 都绑定了 data 中的 type,只有条件满足才会渲染,如果都不满足就渲染 v-else 的元素。
效果如下:

使用场景
因为 v-if 会重新渲染或删除元素,而且如果初始条件为 false 就不会渲染。比较适合用在一些不需要平凡切换或内容较多的元素。例如不同页面之间切换就比较适合用 v-if。
配合动画使用
Vue 提供了 transition 的封装组件,可以给使用 v-show 和 v-if 的元素添加过渡动画。
使用方法
<template>
<div id="app">
<button type="button" @click="show = !show">显示/隐藏</button>
<transition name="fade">
<div class="box" v-show="show"></div>
</transition>
</div>
</template>export default {
name: 'app',
data () {
return {
show: true
}
}
}.fade-enter-active, .fade-leave-active {
transition: opacity .5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}要使用过渡动画的元素需要写在 transition 内。
效果如下:

Vue 使用的是 CSS3 的 transition 动画。
更多关于过渡动画的说明可以查看 官网的说明 。
相关文章:
版权声明:本文为原创文章,版权归 Changbin's Blog 所有,转载请联系博主获得授权。
本文地址:https://www.misterma.com/archives/823/
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。