要明确两个都是作为条件渲染的指令
v-if
- 表达式返回
truthy
值时渲染; - 可配合
v-else
和v-else-if
使用( 注意v-else
、v-else-if
元素必须紧跟在带v-if
或者v-else-if
的元素的后面 ); v-if
可以 在<template>
元素中使用;,最终渲染结果不会出现<template>
;- 条件渲染中如果有被复用元素,建议使用
key
值, 保证每次切换时,复用元素都将被重新渲染;
v-show
- 表达式返回
truthy
值时渲染; - 不支持
v-else
; - 不支持在
<template>
元素中使用;
区别
-
v-if
是动态的向 DOM 树内添加或者删除 DOM 元素;v-show
是通过设置 DOM 元素的 display 样式属性控制显隐;v-if
是“真正”的条件渲染,因为v-if
之中的模板也可能包括数据绑定或子组件,它在编译过程有一个局部编译/卸载的过程,会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。v-if
也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。相比之下,
v-show
就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 display样式 进行切换。 -
v-if
支持在<template>
元素中使用;v-show
不支持在<template>
元素中使用;v-if
切换会导致整个false
条件内容被卸载,不管v-if
绑定在什么元素上,渲染结果不会出现false
条件的内容。v-show
的切换是通过js代码去修改元素的element style
,如果value
为false
,设置display: none
; 如果value
为true
,设置display: ''
;所以必须有真实存在的DOM
结构才可以,而页面渲染出真正的DOM
元素后不会存在<template>
标签。tips: 使用
v-show
的话,如果需要在渲染开始的提前设置显隐值,尽量在直接在元素标签的style
里面设置display
的值,不要在css
文件中,不然可能会被覆盖。 -
一般来说,
v-if
有更高的切换开销,而v-show
有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用
v-show
较好;如果在运行时条件很少改变,则使用v-if
较好。