Vue 3 条件渲染与列表渲染完整指南

devtools/2024/11/16 11:32:42/
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

Vue 3 条件渲染与列表渲染完整指南

在 Vue 3 中,v-ifv-showv-for 是非常常用的指令,帮助我们实现条件渲染和列表渲染。本文将详细介绍这些指令的基本用法、适用场景、常见优化技巧和注意事项。


一、v-if 指令

1. v-if 基本用法

v-if 是一个用于条件渲染的指令,根据表达式的结果决定是否渲染元素。表达式为真时,元素会被渲染;为假时,元素不会被插入到 DOM 中。

<template><button @click="toggle">切换显示</button><p v-if="isVisible">这是一个条件渲染的段落</p>
</template><script setup>
import { ref } from 'vue';const isVisible = ref(false);function toggle() {isVisible.value = !isVisible.value;
}
</script>

解释:

  • v-if="isVisible" 控制 p 标签的显示。点击按钮会切换 isVisible 的值,从而决定 p 标签的渲染与否。

2. v-else-ifv-else

v-else-ifv-else 是和 v-if 一起使用的条件分支。v-else-if 用于添加额外条件,而 v-else 则处理所有未被匹配的情况。

<template><button @click="changeStatus">切换状态</button><p v-if="status === 'loading'">加载中...</p><p v-else-if="status === 'success'">加载成功!</p><p v-else>加载失败,请重试。</p>
</template><script setup>
import { ref } from 'vue';const status = ref('loading');function changeStatus() {status.value = status.value === 'loading' ? 'success' : 'error';
}
</script>

解释:

  • status 的值不同会渲染出不同的内容,体现了 v-ifv-else-ifv-else 的联合使用方式。

3. v-ifv-show 的区别

  • v-if 是真正的条件渲染,不符合条件的元素不会被渲染到 DOM 中;适合用于较少切换的情况。
  • v-show 只是通过 CSS 设置元素的 display 属性来控制显示或隐藏,DOM 元素始终存在于页面中;适合频繁切换的场景。

二、v-show 指令

v-show 通过设置元素的 display 样式来控制显示隐藏。与 v-if 不同的是,v-show 不会动态移除或添加元素,而是直接切换其可见性。

v-show 用法示例

<template><button @click="toggle">切换显示</button><p v-show="isVisible">这是一个 v-show 的段落</p>
</template><script setup>
import { ref } from 'vue';const isVisible = ref(false);function toggle() {isVisible.value = !isVisible.value;
}
</script>

解释:

  • v-show="isVisible" 控制 p 标签的显示,通过 CSS 的 display: none 来实现隐藏,适合于需要频繁显示和隐藏的场景。

v-ifv-show 的选择

  • v-if 更适合在渲染开销较大的情况下使用,例如列表和复杂组件。
  • v-show 适合需要频繁显示和隐藏的简单元素,因为 v-show 只是通过 CSS 切换可见性。

三、v-for 指令

v-for 用于列表渲染,可以遍历数组或对象并生成对应的元素。它是 Vue 中处理重复数据的强大工具。

1. 基本用法

v-for 使用 item in items 的语法遍历一个数组,并在模板中渲染每个元素。为了提高渲染性能,建议使用 key 属性来唯一标识每个项目。

<template><ul><li v-for="(item, index) in items" :key="index">{{ item }}</li></ul>
</template><script setup>
import { ref } from 'vue';const items = ref(['苹果', '香蕉', '橘子']);
</script>

解释:

  • v-for="(item, index) in items" 遍历 items 数组,并将每个元素赋值给 item 变量,同时提供索引 index

2. 使用 v-for 遍历对象

v-for 也可以用于遍历对象,语法为 (value, key, index) in object

<template><ul><li v-for="(value, key) in info" :key="key">{{ key }}: {{ value }}</li></ul>
</template><script setup>
import { ref } from 'vue';const info = ref({name: '张三',age: 25,city: '北京'
});
</script>

解释:

  • v-for="(value, key) in info" 遍历 info 对象,分别将键赋值给 key,值赋值给 value,并生成每个键值对的列表项。

3. v-forv-if 一起使用

v-forv-if 同时存在时,v-if 优先级较高。在循环中使用条件判断时,建议放置在循环内部,以避免性能开销。

<template><ul><li v-for="item in items" :key="item.id" v-if="item.active">{{ item.name }}</li></ul>
</template><script setup>
import { ref } from 'vue';const items = ref([{ id: 1, name: '项目 A', active: true },{ id: 2, name: '项目 B', active: false },{ id: 3, name: '项目 C', active: true }
]);
</script>

解释:

  • 仅渲染 activetrue 的项目,避免不必要的元素渲染以优化性能。

4. v-for 中的 key 属性

key 属性帮助 Vue 更好地追踪元素的变化,提高渲染性能。通常,我们将唯一标识字段(如 id)作为 key 的值。

<template><ul><li v-for="item in items" :key="item.id">{{ item.name }}</li></ul>
</template><script setup>
import { ref } from 'vue';const items = ref([{ id: 1, name: '项目 A' },{ id: 2, name: '项目 B' },{ id: 3, name: '项目 C' }
]);
</script>

注意事项:

  • 避免使用索引 index 作为 key,因为数据变化时索引可能会变化,导致重新渲染,影响性能。

四、v-ifv-showv-for 的最佳实践

  1. v-ifv-show 的选择:

    • 如果是较少切换且渲染开销大的组件,使用 v-if
    • 如果是频繁切换的简单元素,使用 v-show
  2. 避免 v-forv-if 一起使用:

    • 若同时使用 v-forv-if,建议将 v-if 放在 v-for 内部,以减少性能消耗。
  3. 使用 key 优化 v-for

    • 始终为 v-for 中的元素提供唯一的 key,以帮助 Vue 追踪变化并高效地更新 DOM。
  4. 对象的遍历顺序:

    • 遍历对象时,键的顺序并不保证与对象的声明顺序一致。

总结

本文详细介绍了 Vue 3 中的 v-ifv-showv-for 指令的使用方法、适用场景、常见优化技巧和注意事项。在实际开发中,合理使用这些指令不仅可以提高代码的可读性,还能提升应用性能。掌握这些条件和列表渲染的技巧,可以帮助你更灵活地构建 Vue 应用。


希望本文对你有所帮助,欢迎在评论区留下你的问题与见解!


http://www.ppmy.cn/devtools/134416.html

相关文章

llama factory lora 微调 qwen2.5 7B Instruct模型

项目背景 甲方提供一台三卡4080显卡 需要进行qwen2.5 7b Instruct模型进行微调。以下为整体设计。 要使用 LLaMA-Factory 对 Qwen2.5 7B Instruct模型 进行 LoRA&#xff08;Low-Rank Adapters&#xff09;微调&#xff0c;流程与之前提到的 Qwen2 7B Instruct 模型类似。LoRA …

MathGPT的原理介绍,在中小学数学教学的应用场景,以及代码样例实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下MathGPT的原理介绍&#xff0c;在中小学数学教学的应用场景&#xff0c;以及代码样例实现。MathGPT的核心架构是一个精心设计的多层次系统&#xff0c;旨在有效处理复杂的数学问题。其主要组成部分包括 数学知识图谱…

用OMS进行 OceanBase 租户间数据迁移的测评

基本概念 OceanBase迁移服务&#xff08;&#xff0c;简称OMS&#xff09;&#xff0c;可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互&#xff0c;支持数据的在线迁移&#xff0c;以及实时增量同步的复制功能。 OMS 提供了可视化的集中管控平台&#xff…

elementUI input 禁止内容两端存在空格,或者是自动去除两端空格

需求 项目中有需求&#xff1a;输入框中禁止内容两端存在空格&#xff0c;或者是自动去除两端空格。 解决方法 vue的api文档中有过介绍&#xff0c;使用.trim可以去掉用户输入内容中两端的空格&#xff0c;如下图 代码 <el-input v-model.trim"name" cleara…

浪浪云轻量服务器搭建vulfocus网络安全靶场

什么是网络安全靶场 网络安全靶场是一个模拟真实网络环境的训练平台&#xff0c;旨在为网络安全专业人员提供一个安全的环境来测试和提高他们的技能。靶场通常包括各种网络设备、操作系统、应用程序和安全工具&#xff0c;允许用户在其中进行攻击和防御练习。以下是网络安全靶…

【CUDA】Warp解析

目录 一、初步认识 二、Warps and Thread Blocks 三、Warp Divergence 四、资源分区 五、延迟隐藏 六、占有率 七、Synchronize 一、初步认识 warp 是 SM 的基本执行单元。一个 warp 包含 32 个并行 thread&#xff0c;这32个 thread 执行于 SMIT模式。即所有 thread …

百度 2025届秋招提前批 文心一言大模型算法工程师

文章目录 个人情况一面/技术面 1h二面/技术面 1h三面/技术面 40min 个人情况 先说一下个人情况&#xff1a; 学校情况&#xff1a;211本中9硕&#xff0c;本硕学校都一般&#xff0c;本硕都是计算机科班&#xff0c;但研究方向并不是NLP&#xff0c;而是图表示学习论文情况&a…

CTF练习4

RSA加密 注&#xff1a;L&#xff1a;是与N互质的个数不是最小公倍数这里的最小公倍数指的是存在于N中(互质当N个整数的最大公因数是1时&#xff0c;则称这N个整数为互质&#xff09; 解密&#xff1a;因为N与E是公开的所以要解密就要求出D&#xff0c;要解出D就要求出L,要求出…