天天看点

vue v-if 和 v-show的区别

今天在看vue文档的时候,通过浏览器的控制台发现了一件有意思的事情

先不说v-if或者v-show,说说v-model,有这么一段代码:(菜鸟教程传送门)

<div id="app">
  <label for="r1">修改颜色</label><input type="checkbox" v-model="class1" id="r1">
  <br><br>
  <div v-bind:class="{'class1': class1}">
    directiva v-bind:class
  </div>
</div>
    
<script>
new Vue({
    el: '#app',
  data:{
      class1: false
  }
});
</script>
           

发现如果把class1的样式改为display: none的时候,也可以实现隐藏显示的效果,这让我想起了v-if和v-show

刚开始学的时候我以为vue在搞什么鬼都是显示与隐藏,为什么搞这么多麻烦,但是打开控制器一看才发现了问题:

v-if实现的显示与隐藏是dom结构里面的有或者没有,也就是说在使用v-if的情况下,浏览器的dom结构没有渲染出这个元素。

当然排除一些特殊的情况,比如用v-if去操作某个元素style的display属性一样会有显示与隐藏的效果,只是运行起来的逻辑和运行内存占比不一样(v-if内存占比比v-show大),下面是代码:(来源于菜鸟教程)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
<script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
    <p v-if="seen">现在你看到我了</p>
    <template v-if="ok">
      <h1>菜鸟教程</h1>
      <p>学的不仅是技术,更是梦想!</p>
      <p>哈哈哈,打字辛苦啊!!!</p>
    </template>
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    seen: true,
    ok: true
  }
})
</script>
</body>
</html>
           

做出相应的调整之后你就会发现,seen和ok为false的情况下就都是在浏览器里面没渲染出来的

v-show只有display: block/none 但是在浏览器的dom结构中是存在的,也就是说浏览器已经渲染了元素,但是控制样式没有显示而已,多说无益,上代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>v-show</title>
	<script type="text/javascript" src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
	
</head>
<body>
	<div id="app">
		<button v-on:click="ck">点击</button>
		<div v-show="seen">隐藏还是显示呢</div>
	</div>
	<script type="text/javascript">
		var app = new Vue({
			el: '#app',
			data: {
				seen: true
			},
			methods: {
				ck: function () {
					this.seen = !this.seen
					console.log(this.seen)
				}
			}
		});
	</script>
</body>
</html>
           

那么结果就是div在display:block和none之间更换,单纯做隐藏显示,但是浏览器在初始化页面的时候已经加载了这个dom节点,我感觉这个效率会很高,因为它毕竟运行空间小功能单一,所以会快很多

总结:v-if可以实现布尔值更换,也可嵌套v-else和v-else-if,可以说是功能相比比较齐全,相当于编程语言中的if..else,是渲染或者不渲染,但是v-show只负责操作css的显示和隐藏,并且操作的元素都是浏览器渲染过的。

以上均为博主原创,如有转载,请注明出处和作者!

继续阅读