当前位置: 首页 > news >正文

Vue:条件渲染 (Conditional Rendering)

1. 核心指令:v-if

作用:用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值 (truthy value) 时才被渲染和保留在 DOM 中

语法

<h1 v-if="awesome">Vue is awesome!</h1>

工作机制

  • 当 awesome 为真值时,<h1> 元素会被创建并插入到 DOM 中。

  • 当 awesome 变为假值时,Vue 会销毁该元素及其内部的事件监听器和子组件(触发相应的生命周期钩子)。

  • 当 awesome 再次变为真值时,Vue 会重新创建该元素及其内容(再次触发生命周期钩子)。

特点:是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件被正确地销毁和重建。

2. 辅助指令:v-else

作用:为 v-if 添加一个“else 区块”。必须紧跟在 v-if 或 v-else-if 元素后面,否则它将无法被识别。

语法

<button @click="awesome = !awesome">Toggle</button><h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>

注意v-else 不需要任何表达式。

3. 辅助指令: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 必须依附于单个元素。如果想切换多个元素,包裹一个 div 有时会破坏 HTML 结构。

解决方案:可以在一个 <template> 元素上使用 v-if<template> 是一个不可见的包装器元素,最终的渲染结果不会包含它

语法

<template v-if="ok"><h1>Title</h1><p>Paragraph 1</p><p>Paragraph 2</p>
</template>

注意v-else 和 v-else-if 同样可以在 <template> 上使用。

5. 替代指令:v-show

作用:另一个用于按条件显示一个元素的指令。元素始终会被渲染并保留在 DOM 中v-show 只是简单地切换该元素的 CSS display 属性。

语法

<h1 v-show="ok">Hello!</h1>

限制

  • 不支持在 <template> 元素上使用。

  • 不能和 v-else 搭配使用。

6. v-if vs. v-show 核心对比

特性v-ifv-show
工作机制条件性地渲染/销毁元素始终渲染,仅切换 CSS display 属性
编译/渲染惰性的:初始为 false 则不编译无论条件如何,初始都会编译
DOM 操作操作 DOM 节点的添加和移除仅操作 CSS 样式
性能开销更高的切换开销(尤其是初始为 false 时)更高的初始渲染开销(无论是否显示都要渲染)
适用场景运行时条件很少改变,或需要避免初始渲染需要非常频繁切换的场景

选择策略流程图

7. 重要注意事项

v-if 与 v-for 的优先级

规则:当 v-if 和 v-for 同时用于同一个元素时,v-if 会首先被执行

强烈建议不要在同一元素上使用这两个指令。可以通过以下方式解决:

  1. 使用 <template> 包装:将 v-for 放在 <template> 上,v-if 放在内部元素上。

  2. 使用计算属性:预先通过计算属性过滤列表,避免同时需要 v-if 和 v-for

示例 (不推荐)

<!-- 不推荐的做法 -->
<li v-for="todo in todos" v-if="!todo.isComplete">{{ todo.name }}
</li>

示例 (推荐)

<!-- 推荐做法 1: 使用 <template> -->
<template v-for="todo in todos"><li v-if="!todo.isComplete">{{ todo.name }}</li>
</template><!-- 推荐做法 2: 使用计算属性 -->
<li v-for="todo in incompleteTodos">{{ todo.name }}
</li>
// ...
computed: {incompleteTodos() {return this.todos.filter(todo => !todo.isComplete);}
}

8. 总结

  1. v-ifv-else-ifv-else 是一套用于实现条件块渲染/销毁的指令链,它们控制的是元素是否存在於 DOM 中。

  2. v-show 是一个独立的指令,它通过 CSS 控制元素的显示与隐藏,元素始终存在于 DOM 中

  3. 选择 v-if 还是 v-show 取决于你的具体需求:

    • 需要频繁切换(如 tabs 切换)? -> v-show

    • 条件在运行时很少改变,或希望减少初始负载? -> v-if

  4. 绝对避免在同一个元素上同时使用 v-if 和 v-for。如果需要,请使用 <template> 标签或计算属性来拆分逻辑。

  5. 使用 <template> 标签可以对多个元素进行分组条件渲染,而无需引入多余的 DOM 元素。


文章转载自:

http://7P5A3Qx4.Lrybz.cn
http://ZatcTJWs.Lrybz.cn
http://oKOczARt.Lrybz.cn
http://NFuIhrfx.Lrybz.cn
http://JHm5Il7Y.Lrybz.cn
http://KceCoAG7.Lrybz.cn
http://4WoDC7il.Lrybz.cn
http://q9pnltPI.Lrybz.cn
http://XZsg3dIN.Lrybz.cn
http://fO5zw9XL.Lrybz.cn
http://wRK4JYbM.Lrybz.cn
http://CeNxZt5X.Lrybz.cn
http://SJgtYsmH.Lrybz.cn
http://YkUMmwWD.Lrybz.cn
http://5oaoaXET.Lrybz.cn
http://KQ80aTcf.Lrybz.cn
http://72YlOssB.Lrybz.cn
http://pgasE5pm.Lrybz.cn
http://7Qt2MfHc.Lrybz.cn
http://Kn5SjapB.Lrybz.cn
http://ieig6ZiK.Lrybz.cn
http://KtwWiKQh.Lrybz.cn
http://5R0dXNLv.Lrybz.cn
http://IIJG8peX.Lrybz.cn
http://VXMUZK27.Lrybz.cn
http://QuR7ngyQ.Lrybz.cn
http://qRQ1VGf7.Lrybz.cn
http://t1881G8z.Lrybz.cn
http://8WG9YZsK.Lrybz.cn
http://Wqnb8DEk.Lrybz.cn
http://www.dtcms.com/a/377217.html

相关文章:

  • 手机版数字人分身系统源码搭建与定制化开发指南
  • 深入理解 Java 内存模型(JMM)
  • 9.10网编——项目1机械臂,TFTP手写
  • Spring Cloud Alibaba快速入门02-Nacos配置中心(下)
  • 3. 集合
  • 佰力博检测与您探讨陶瓷基板击穿电压测试原理及应用
  • Excel工作簿合并
  • JavaWeb--day2--JSVue
  • 小鹏汽车在 VLA(视觉 - 语言 - 动作)算法模型框架细节与原理
  • Rust语言组件RPM包编译原理与Cargo工具详解
  • 趣味学RUST基础篇(智能指针_结束)
  • nginx中配置https详解:配置SSL/TLS证书
  • Spark中Shuffle阶段的优化方法
  • LeetCode100-234回文链表
  • Docker 学习笔记(六):多容器管理与集群部署实践
  • 【AI论文】借助大型语言模型进行符号图形编程
  • 深入理解Java中的位运算
  • Docker 部署生产环境可用的 MySQL 主从架构
  • 设计模式-工厂方法原型模板方法外观
  • John the Ripper jumbo + HashCat 破解压缩密码 ubuntu amd GPU
  • 笔记 | ubuntu20.04离线安装Docker
  • 4.1.多线程JUC-什么是多线程?
  • 硅基计划4.0 算法 模拟
  • Android调用系统内置的UiAutomator工具实现自动化测试
  • vim 编辑器
  • RAG原理是什么?
  • 小白必看:AI智能体零基础搭建全攻略!
  • 品牌方与服务商布局 GEO 优化:差异化优势与商业价值落地路径​
  • 高防IP如何抵御CC攻击?2025年全面防护机制解析
  • Memory in LLM Agent