Vue.js 中 v-if 的使用及其原理

在 Vue.js 的开发过程中,条件渲染是一项极为常见的需求。v-if指令作为 Vue.js 实现条件渲染的关键手段,能够根据表达式的真假来决定是否渲染某一块 DOM 元素。它在优化页面展示逻辑、提升用户体验等方面发挥着重要作用。接下来,我们就深入探讨v-if的使用场景及其背后的工作原理。​

一、v-if 的基本使用​

v-if指令需要绑定一个表达式,当表达式的值为true时,其所在的元素以及内部的子元素会被渲染到 DOM 树中;当表达式的值为false时,这些元素则不会被渲染,或者说从 DOM 树中被移除。​

(一)简单元素的条件渲染​

最基础的应用场景就是对单个元素进行条件渲染。例如,我们有一个需​求,只有用户登录后,才显示欢迎信息。代码如下:

<template><div><p v-if="isLoggedIn">欢迎回来,用户!</p></div>
</template><script>
export default {data() {return {isLoggedIn: false};}
};
</script>

在这段代码中,v-if绑定了isLoggedIn变量。由于初始时isLoggedIn为false,所以<p>标签及其内容不会被渲染到页面上。当isLoggedIn的值变为true时,<p>标签才会出现在页面中。​

(二)多个元素的条件分组​

有时我们需要对多个元素进行统一的条件渲染。在 Vue.js 中,可以使用<template>标签作为条件分组的容器,因为<template>标签不会在最终的 DOM 结构中产生实际的元素。示例如下:

<template><div><template v-if="isAdmin"><h2>管理面板</h2><p>这里是管理员专属的操作区域。</p></template></div>
</template><script>
export default {data() {return {isAdmin: true};}
};
</script>

在上述代码中,<template>标签包裹了<h2>和<p>两个元素,只有当isAdmin为true时,这两个元素才会一起被渲染到页面上。​

(三)v-else 和 v-else-if 的搭配使用​

v-else和v-else-if指令通常与v-if一起使用,用于创建更复杂的条件分支。v-else表示v-if条件为false时的备用渲染内容,而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>
export default {data() {return {score: 75};}
};
</script>

在这个例子中,根据score的值,不同的<p>标签会被渲染。如果score大于等于 90,显示 “优秀”;如果score大于等于 60 且小于 90,显示 “及格”;否则显示 “不及格”。​

二、v-if 的原理剖析​

Vue.js 在解析模板时,会将v-if指令转换为 JavaScript 代码来实现条件渲染的逻辑。当表达式的值发生变化时,Vue.js 会重新计算该表达式,并根据结果决定是否更新 DOM。​

(一)初始渲染阶段​

在 Vue 实例初始化并挂载到 DOM 的过程中,Vue.js 会遍历模板中的所有指令。当遇到v-if指令时,它会立即计算绑定的表达式的值。如果表达式的值为true,则会将对应的 DOM 元素及其子元素正常创建并插入到 DOM 树中;如果表达式的值为false,则直接跳过该元素及其子元素的创建,不会将它们添加到 DOM 树中。​

(二)数据变化时的更新阶段​

当v-if绑定的数据发生变化时,Vue.js 会再次计算表达式的值。如果新的值与旧的值不同,就会触发 DOM 更新操作。如果新值为true且之前元素未被渲染,Vue.js 会创建对应的 DOM 元素并插入到正确的位置;如果新值为false且之前元素已被渲染,Vue.js 会从 DOM 树中移除该元素及其子元素。​

Vue.js 的响应式系统在这个过程中起着关键作用。它通过 Object.defineProperty () 方法对数据进行劫持,当数据发生变化时,会自动通知相关的 Watcher(观察者)。而v-if指令对应的 Watcher 会重新计算表达式,进而决定是否更新 DOM。​

三、v-if 与 v-show 的区别​

在 Vue.js 中,v-show也是用于控制元素显示与隐藏的指令,它与v-if有相似之处,但在实现原理和使用场景上存在明显区别。​

(一)原理区别​

v-if是真正的条件渲染,它会根据条件的真假在 DOM 树中添加或移除元素。而v-show则是通过控制元素的 CSS 属性display来实现显示与隐藏。无论初始条件如何,使用v-show的元素都会被渲染到 DOM 树中,只是初始时可能会通过display:none隐藏起来。​

(二)使用场景区别​

由于v-if在条件切换时会进行 DOM 元素的创建和销毁操作,所以它适合那些在运行时条件很少改变的场景,因为频繁的 DOM 操作会带来一定的性能开销。而v-show只是切换元素的显示状态,不会涉及 DOM 元素的创建和销毁,所以适合那些需要频繁切换显示状态的场景,比如一些交互元素的显示与隐藏。​

例如,对于一个在页面加载后可能只会显示或隐藏一次的提示信息,使用v-if更为合适;而对于一个需要在用户操作过程中频繁显示和隐藏的菜单,使用v-show会更高效。​

四、总结​

v-if指令作为 Vue.js 中实现条件渲染的核心指令,通过简单而强大的语法,能够轻松实现根据不同条件来控制 DOM 元素的渲染与不渲染。深入理解v-if的使用方法以及其背后的工作原理,有助于开发者在项目中更加灵活、高效地构建页面展示逻辑。同时,明确v-if与v-show的区别,能够让我们在不同的业务场景下选择最合适的解决方案,从而提升应用程序的性能和用户体验。

希望通过本文的介绍,你对v-if有了更全面、深入的认识,并能在实际开发中熟练运用它。


希望这篇博客对你有所帮助,如果有任何问题和建议欢迎留言讨论 !!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/78809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Verilog:LED呼吸灯

模块接口说明 信号方向描述clk输入系统时钟&#xff08;100MHz&#xff0c;周期10ns&#xff09;rst_n输入低电平有效的异步复位信号led_en输入总使能信号&#xff08;1开启呼吸灯&#xff0c;0关闭&#xff09;speed_en输入呼吸速度调节使能信号speed[2:0]输入呼吸速度分级&a…

我的计算机网络(总览篇)

总览--网络协议的角度 在一个庞大的网络中&#xff0c;该从哪里去了解呢&#xff1f;我先细细的讲一下我们访问一个网站的全部流程&#xff0c;当我们的电脑连上网络的时候&#xff0c;就会启动DHCP协议&#xff0c;来进行IP地址&#xff0c;MAC地址&#xff0c;DNS地址的分配…

开源的PMPI库实现及示例代码

开源的PMPI库实现及示例代码 PMPI (Profiling MPI) 是MPI标准中定义的接口&#xff0c;允许开发者通过拦截MPI调用进行性能测量和调试。以下是几个常用的开源PMPI库实现&#xff1a; 1. MPICH的PMPI接口 MPICH本身提供了PMPI接口&#xff0c;可以直接使用。 2. OpenMPI的PM…

Unity 基于navMesh的怪物追踪惯性系统

今天做项目适合 策划想要实现一个在现有的怪物追踪系统上实现怪物拥有惯性功能 以下是解决方案分享&#xff1a; 怪物基类代码&#xff1a; ​ using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …

PyTorch进阶学习笔记[长期更新]

第一章 PyTorch简介和安装 PyTorch是一个很强大的深度学习库&#xff0c;在学术中使用占比很大。 我这里是Mac系统的安装&#xff0c;相比起教程中的win/linux安装感觉还是简单不少&#xff08;之前就已经安好啦&#xff09;&#xff0c;有需要指导的小伙伴可以评论。 第二章…

【区块链安全 | 第三十八篇】合约审计之获取私有数据(二)

文章目录 前言漏洞代码代码审计攻击步骤修复/开发建议审计思路前言 在【区块链安全 | 第三十七篇】合约审计之获取私有数据(一)中,介绍了私有数据、访问私有数据实例、Solidity 中的数据存储方式等知识,本文通过分析具体合约代码进行案例分析。 漏洞代码 // SPDX-Licens…

《微服务与事件驱动架构》读书分享

《微服务与事件驱动架构》读书分享 Building Event-Driver Microservices 英文原版由 OReilly Media, Inc. 出版&#xff0c;2020 作者&#xff1a;[加] 亚当 • 贝勒马尔 译者&#xff1a;温正东 作者简介&#xff1a; 这本书由亚当贝勒马尔&#xff08;Adam Bellemare…

小刚说C语言刷题——第22讲 二维数组

昨天我们讲了一维数组&#xff0c;今天我们来讲二维数组。 1.定义 二维数组是指在数组名后跟两个方括号的数组。 2.语法格式 数据类型 数组名[下标][下标] 例如&#xff1a;int a[5][9];//表示5行9列的数组 3.访问二维数组元素 格式&#xff1a;数组名[行坐标][列坐标]…

Vue 大文件分片上传组件实现解析

Vue 大文件分片上传组件实现解析 一、功能概述 1.1本组件基于 Vue Element UI 实现&#xff0c;主要功能特点&#xff1a; 大文件分片上传&#xff1a;支持 2MB 分片切割上传实时进度显示&#xff1a;可视化展示每个文件上传进度智能格式校验&#xff1a;支持文件类型、大小…

「逻辑推理」AtCoder AT_abc401_d D - Logical Filling

前言 这次的 D 题出得很好&#xff0c;不仅融合了数学逻辑推理的知识&#xff0c;还有很多细节值得反复思考。虽然通过人数远高于 E&#xff0c;但是通过率甚至不到 60%&#xff0c;可见这些细节正是出题人的侧重点。 题目大意 给定一个长度为 N N N 的字符串 S S S&#…

腾讯后台开发 一面

一、手撕 合并升序链表 合并两个排序的链表_牛客题霸_牛客网 顺时针翻转矩阵 顺时针旋转矩阵_牛客题霸_牛客网 二、八股 1、静态变量和实例变量 public class House {public static String buildDate "2024-10-27"; // 静态变量public String color; // 实…

Unity 动画

Apply Root Motion 勾选的话就会使用动画片段自带的位移 Update Mode &#xff08;动画重新计算骨骼位置转向缩放的数值&#xff09;&#xff1a; Normal &#xff1a; 随Update走&#xff0c;每次Update都计算Animate Physics &#xff1a;与 fixed Update() 同步&#xff0…

NDT和ICP构建点云地图 |【点云建图、Ubuntu、ROS】

### 本博客记录学习NDT&#xff0c;ICP构建点云地图的实验过程&#xff0c;参考的以下两篇博客&#xff1a; 无人驾驶汽车系统入门&#xff08;十三&#xff09;——正态分布变换&#xff08;NDT&#xff09;配准与无人车定位_settransformationepsilon-CSDN博客 PCL中点云配…

基于HTML + jQuery + Bootstrap 4实现(Web)地铁票价信息生成系统

地铁票价信息表生成系统 1. 需求分析 1.1 背景 地铁已经成为大多数人出行的首选,北京地铁有多条运营线路, 截至 2019 年 12 月,北京市轨道交通路网运营线路达 23 条、总里程 699.3 公里、车站 405 座。2019 年,北京地铁年乘客量达到 45.3 亿人次,日均客流为 1241.1 万人次…

EtherNet/IP 转 Modbus 协议网关

一、产品概述 1.1 产品用途 SG-EIP-MOD-210 网关可以实现将 Modbus 接口设备连接到 EtherNet/IP 网 络中。用户不需要了解具体的 Modbus 和 EtherNet/IP 协议即可实现将 Modbus 设 备挂载到 EtherNet/IP 接口的 PLC 上&#xff0c;并和 Modbus 设备进行数…

PostgreSQL:逻辑复制与物理复制

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

腾讯云COS与ZKmall 开源商城的存储集成方案

ZKmall 开源商城与腾讯云对象存储&#xff08;COS&#xff09;的集成&#xff0c;可通过云端资源托管、自动化数据同步、高性能存储架构实现本地存储负载降低与访问效率提升。以下是基于搜索结果的集成路径与核心优化点&#xff1a; 一、存储架构升级&#xff1a;本地与云端协同…

HTML — 浮动

浮动 HTML浮动&#xff08;Float&#xff09;是一种CSS布局技术&#xff0c;通过float: left或float: right使元素脱离常规文档流并向左/右对齐&#xff0c;常用于图文混排或横向排列内容。浮动元素会紧贴父容器或相邻浮动元素的边缘&#xff0c;但脱离文档流后可能导致父容器高…

【软件测试学习day1】软件测试概念

前言 本篇学习&#xff0c;测试相关基础概念、常见的开发模型测和测试模型&#xff0c;搞懂4个问题&#xff1a; 什么是需求什么是 bug什么是测试用例开发模型和测试模型 目录 1. 什么是需求 1.1 为什么要有需求 1.2 测试人员眼里的需求 1.3 如何深入了解需求 2. 测试用例…

Flutter常用组件实践

Flutter常用组件实践 1、MaterialApp 和 Center(组件居中)2、Scaffold3、Container(容器)4、BoxDecoration(装饰器)5、Column(纵向布局)及Icon(图标)6、Column/Row(横向/横向布局)+CloseButton/BackButton/IconButton(简单按钮)7、Expanded和Flexible8、Stack和Po…