基础/条件渲染

110 阅读2分钟

v-if

这又是一个 Vue 内置的指令,如果传递的表达式返回值为真值,那么就会渲染这个标签及标签内的内容。

<template>
  <h1 v-if="helloIsShow">Hello</h1>
</template>

<script setup>
  import { ref } from 'vue'
  
  const helloIsShow = ref(true)
</script>
数据类型为真值为假值
booleantruefalse
number非零值0、NaN
string非空字符串空字符串
object任意对象null
undefinedundefined

v-else

和你想的一样,v-else 指令类似 if else 语句的 else 部分,和 else 类似,v-else 必须跟在设置了 v-if 或者 v-else-if 的元素后面,无法单独使用

<template>
  <h1 v-if="helloIsShow">Hello</h1>
  <!-- 只会渲染下面这个 -->
  <h2 v-esle>World</h2>
</template>

<script setup>
  import { ref } from 'vue'
  
  const helloIsShow = ref(false)
</script>

v-else-if

v-else-if 类似于 else-if 语句,只能跟在设置了 v-if 或者 v-else-if 的元素后面使用,无法单独使用。当然我们可以只有 v-ifv-else-if 不使用 v-else

<template>
  <h1 v-if="helloIsShow">Hello</h1>
  <!-- 只会渲染下面这个 -->
  <h2 v-esle-if="!helloIsShow">World</h2>
</template>

<script setup>
  import { ref } from 'vue'
  
  const helloIsShow = ref(false)
</script>

template 上的 v-if

如果想一次性控制某一个区域的渲染或隐藏,可以使用 template 标签包裹,然后在 tempalte 上可以使用 v-ifv-else-ifv-else ,当然用其他的双标签 HTML 标签都可以,只不过 template 不会产生实际的 DOM。

<template>
  <template v-if="userHasLogin">
    <p>用户名: {{ useInfo.name }}</p>
    <p>邮箱: {{ useInfo.email }}</p>
  </template>
</template>

<script setup>
  import { ref } from 'vue'
  
  const userHasLogin = ref(false)
  const userInfo = ref({
    name: '',
    email: ''
  })
</script>

v-show

可以使用 v-show 替代 v-if 指令,注意在设置 v-show 的元素后面无法给后续元素使用 v-else-ifv-else 指令。

v-show 指令无法在 template 标签上使用。

v-ifv-show

设置了 v-if 的元素,如果表达式返回的是假值,那么这个标签以及标签内的其他内容都不会创建实际的DOM,只有表达式返回真值的时候才会创建对应DOM。

如果你在页面上通过 v-if 来实现内容的显示和隐藏,那么每次显示对应内容的时候都是往对应位置添加这些 DOM 元素,也就是说当这些内容被隐藏掉,你无法通过 js 获取DOM。

v-if 不同, v-show 只是修改了元素的 display 这个css属性,如果隐藏内容就是设置 displaynone ,此时你仍可以获取到对应 DOM。

总的来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要频繁切换,则使用 v-show 较好;如果在运行时绑定条件很少改变,则 v-if 会更合适。