vue3中如何处理条件渲染

126 阅读3分钟

vue3中如何处理条件渲染

在 Vue 3 中,条件渲染主要通过以下指令实现:v-ifv-elsev-else-ifv-show。这些指令可以根据条件动态控制元素的显示或隐藏。以下是详细的使用方法和最佳实践:

  1. v-ifv-elsev-else-if

基本用法

  • v-if:根据条件渲染或销毁元素。

  • v-else:必须跟在 v-ifv-else-if 后面,表示“否则”逻辑。

  • v-else-if:用于链式条件判断。

<template>
  <div>
    <p v-if="score >= 90">优秀</p>
    <p v-else-if="score >= 60">及格</p>
    <p v-else>不及格</p>
  </div>
</template>

<script setup>
const score = 85; // 假设分数为 85
</script>

特点:

  • 元素销毁与重建v-if 是“惰性”的,条件为 false 时元素会被销毁,条件为 true 时重新渲染。

  • 适用于复杂场景:适合切换频率较低的场景(如权限控制、动态加载组件)。

  1. v-show

基本用法

  • v-show:根据条件切换元素的 display CSS 属性(隐藏时设为 display: none)。

  • 无论条件如何,元素始终保留在 DOM 中。

特点:

  • 性能开销小:适合频繁切换显示状态的场景(如弹窗、菜单)。

  • 不支持 <template> 标签:只能用于单个元素。

  1. v-if vs v-show

特性v-ifv-show
DOM 操作条件为 false 时销毁元素始终保留元素,切换 display 属性
初始渲染开销高(条件为 false 时无需渲染)低(无论条件如何都会渲染)
切换开销高(需要重建 DOM)低(仅修改 CSS)
适用场景切换频率低、条件可能不变切换频率高
  1. <template> 上使用条件渲染

Vue 3 支持在 <template> 标签上使用 v-if,以控制多个元素的渲染。

<template>
  <template v-if="isAdmin">
    <h1>管理员面板</h1>
    <p>敏感操作区域</p>
  </template>
  <template v-else>
    <h1>普通用户面板</h1>
    <p>常规操作区域</p>
  </template>
</template>

<script setup>
const isAdmin = false; // 假设当前用户不是管理员
</script>
  1. 结合 key 避免元素复用

当 Vue 复用相同类型的元素时(如切换登录/注册表单),可能保留用户输入。通过 key 属性可以强制重新渲染元素。

<template>
  <div>
    <template v-if="isLogin">
      <input key="login" placeholder="用户名">
    </template>
    <template v-else>
      <input key="register" placeholder="邮箱">
    </template>
    <button @click="isLogin = !isLogin">切换表单</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const isLogin = ref(true);
</script>
  1. 条件渲染与组合式 API

在组合式 API 中,可以结合 refreactive 管理条件状态,使逻辑更清晰。

动态权限控制

<template>
  <div>
    <button v-if="userPermissions.includes('edit')">编辑</button>
    <button v-if="userPermissions.includes('delete')">删除</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const userPermissions = ref(['edit']); // 假设用户有编辑权限
</script>

异步加载内容

<template>
  <div>
    <div v-if="loading">加载中...</div>
    <div v-else-if="error">加载失败: {{ error }}</div>
    <div v-else>{{ data }}</div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';

const loading = ref(true);
const error = ref(null);
const data = ref(null);

onMounted(async () => {
  try {
    data.value = await fetchData(); // 模拟异步请求
  } catch (err) {
    error.value = err.message;
  } finally {
    loading.value = false;
  }
});

async function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => resolve('数据加载成功'), 1000);
  });
}
</script>

总结

  • v-if:适合条件可能不变或切换频率低的场景(元素销毁重建)。

  • v-show:适合频繁切换显示状态的场景(仅修改 CSS)。

  • key 属性:避免元素复用问题。

  • 组合式 API:结合 refreactive 管理条件状态,提升代码可维护性。

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github