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.pswp.cn/diannao/78809.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78809.shtml
英文地址,請注明出處:http://en.pswp.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…