一、条件渲染
1、v-if
v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值时才被渲染。
<h1 v-if="awesome">Vue is awesome!</h1>
2、v-else
你也可以使用 v-else 为 v-if 添加一个“else 区块”。
<h1 v-if="awesome">Vue is awesome!</h1> <h1 v-else>Oh no</h1>
3、v-else-if
v-else-if 提供的是相应于 v-if 的“else if 区块”。它可以连续多次重复使用:
<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>Not A/B/C</div>
和 v-else 类似,一个使用 v-else-if 的元素必须紧跟在一个 v-if 或一个 v-else-if 元素后面。
4、<template> 上的 v-if
因为 v-if 是一个指令,他必须依附于某个元素。但如果我们想要切换不止一个元素呢?在这种情况下我们可以在一个 元素上使用 v-if,这只是一个不可见的包装器元素,最后渲染的结果并不会包含这个 元素。
<template v-if="ok"> <h1>Title</h1> <p>Paragraph 1</p> <p>Paragraph 2</p> </template>
v-else 和 v-else-if 也可以在 上使用。
5、v-show
用来按条件显示一个元素的指令是 v-show。其用法基本一样:
<h1 v-show="ok">Hello!</h1>
不同之处在于 v-show 会在 DOM 渲染中保留该元素;v-show 仅切换了该元素上名为 display 的 CSS 属性。
v-show 不支持在 元素上使用,也不能和 v-else 搭配使用。
二、区别:
1、渲染区别
- v-show 是通过控制display属性来进行dom的显示与隐藏
- v-if 是真正意义上的条件渲染,为true是渲染(dom存在),为false时不存在(dom不存在)
2、性能区别:
- v-if有更高的切换开销,v-show有更高的初始渲染开销。
- 如果需要频繁的切换,使用v-show比较好,如果运行条件很少改变,使用v-if比较好。
- v-show比v-if性能更高,因为v-show只能动态的改变样式,不需要增删DOM元素。
- 所以当程序不是很大时候,v-if和v-show区别都不大,如果项目很大,推荐多用v-show,较少浏览器后期操作的性能。
- 需要多种条件场景,比如id=1,=2,=3…时候,因为只有v-if,可以和v-else等连用,这种比较适合用v-if
- v-show不支持语法
- v-if切换的时候会实时的销毁和重建内部的事件、钩子函数等,v-show只会初始化渲染时候执行,再切换时候不会执行生命后期的过程。
三、v-if和v-for的优先级
其实在vue2和vue3中的答案是截然相反的。
- 在vue2中,v-for的优先级高于v-if
- 在vue3中,v-if的优先级高于v-for
v-if指令用于条件性地渲染一块内容。指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 true值的时候被渲染。
v-for指令基于一个数组来渲染一个列表。v-for指令需要使用item in items形式的特殊语法,其中items是源数据数组或者对象,而item则是被迭代的数组元素的别名。
在v-for的时候,建议设置key值,并且保证每一个key值都是独一无二的,这便是diff算法进行优化。
四、注意事项
永远不要把 v-if 和 v-for 同时用在同一个元素上,带来性能方面的浪费(每次渲染都会先循环再进行条件判断)
如果避免出现这种情况,则在外层嵌套template(页面渲染不生成dom节点),在这一层进行v-if判断,然后在内部进行v-for循环
<template v-if="isShow"> <p v-for="item in items"> </template>
如果条件出现在循环内部,可通过计算属性computed提前过滤掉那些不需要显示的项
computed: { items: function() { return this.list.filter(function (item) { return item.isShow }) } }