Vue中 v-show 和 v-if 有什么區別

Vue中的 v-show 和 v-if

  • 一.v-show 與 v-if 原理分析
    • v-show 原理
    • v-if 原理
  • 二、v-show 與 v-if 的共同點
  • 三、v-show 與 v-if 的區別
  • 四、v-show 與 v-if 的使用場景
    • 使用 v-show 的場景:
    • 使用 v-if 的場景:
  • 五、v-show 與 v-if 的優缺點
    • v-show
      • 優點:
      • 缺點:
    • v-if
      • 優點:
      • 缺點:

一.v-show 與 v-if 原理分析

大致流程如下,就不細說了。

  • 將模板template轉為ast結構的JS對象
  • ast得到的JS對象拼裝renderstaticRenderFns函數
  • renderstaticRenderFns函數被調用后生成虛擬VNODE節點,該節點包含創建DOM節點所需信息
  • vm.patch函數通過虛擬DOM算法利用VNODE節點創建真實DOM節點

v-show 原理

不管初始條件是什么,元素總是會被渲染。
我們看一下在vue中是如何實現的
代碼很好理解,有transition就執行transition,沒有就直接設置display屬性

export const vShow: ObjectDirective<VShowElement> = {beforeMount(el, { value }, { transition }) {el._vod = el.style.display === 'none' ? '' : el.style.displayif (transition && value) {transition.beforeEnter(el)} else {setDisplay(el, value)}},mounted(el, { value }, { transition }) {if (transition && value) {transition.enter(el)}},updated(el, { value, oldValue }, { transition }) {// ...},beforeUnmount(el, { value }) {setDisplay(el, value)}
}

v-if 原理

  1. 解析階段:在編譯模板過程中,當遇到帶有 v-if 指令的元素時,會將該指令解析成一個對應的 Vue 實例中的 _directive 對象。

  2. 渲染階段:當 Vue 實例進行渲染時,會通過指令對象的 bind 方法來初始化指令,并根據條件表達式的值判斷是否渲染元素。如果條件為真,則創建并插入元素及其 DOM 結構到父元素中;如果條件為假,則移除元素及其 DOM 結構。

  3. 更新階段:當條件表達式的值發生變化時,Vue 實例會通過指令對象的 update 方法來更新元素的顯示狀態。如果條件從假變為真,則創建并插入元素及其 DOM 結構;如果條件從真變為假,則移除元素及其 DOM 結構。

  4. 銷毀階段:當 Vue 實例被銷毀時,會調用指令對象的 unbind 方法來清理相應的事件監聽器、DOM 結構等資源。

當一個頁面需要根據用戶登錄狀態來顯示不同的內容時,可以使用 v-if 指令。

html部分-----------------------------------------------------<div><h1>Welcome to my website!</h1><template v-if="isLoggedin"><p>Hello, {{ username }}! You are logged in.</p><button @click="logout">Logout</button></template><template v-else><p>Please login to access the content.</p><button @click="login">Login</button></template>
</div>js部分-------------------------------------------------------new Vue({el: '#app',data() {return {isLoggedin: false,username: ''};},methods: {login() {// 模擬登錄操作this.isLoggedin = true;this.username = 'John';},logout() {// 模擬登出操作this.isLoggedin = false;this.username = '';}}
});

在上述例子中,根據 isLoggedin 的值,頁面會渲染不同的內容。如果用戶已登錄,則顯示歡迎信息和登出按鈕;如果用戶未登錄,則顯示登錄提示和登錄按鈕。通過修改 isLoggedin 的值,可以動態地切換顯示不同的內容。

這里使用了 v-if 指令將不同的模塊包裹在 template 標簽中,并通過條件表達式來決定是否渲染對應的模塊。當 isLoggedin 為真時,顯示已登錄的內容;當 isLoggedin 為假時,顯示未登錄的內容。通過點擊登錄按鈕和登出按鈕,可以切換登錄狀態并更新頁面的顯示。

總的來說,v-if 指令實現了一種惰性地渲染元素的機制,它會根據條件表達式的值動態地創建或銷毀元素及其 DOM 結構。通過控制元素的插入和移除,v-if 指令能夠提供更高的靈活性和性能優化,但也會帶來一定的渲染開銷。因此,在選擇 v-if 還是 v-show 時,需要根據具體的需求和性能考慮來決定使用哪種方式。

二、v-show 與 v-if 的共同點

v-showv-if 都是 Vue 框架中用于控制元素顯示/隱藏的指令。

  1. 都可以通過一個布爾類型的條件表達式來判斷是否渲染元素。
  2. 在條件為假時,不會顯示元素。
  3. 在條件為真時,會顯示元素。
  4. 當條件表達式的值發生變化時,都可以更新元素的顯示狀態。

三、v-show 與 v-if 的區別

  1. 狀態初始化
  • v-show:元素一開始會被渲染到 DOM 中,并且可以通過 CSS 的 display 屬性進行顯示和隱藏。初始狀態下,元素始終存在于 DOM 結構中。
  • v-if:元素的渲染是惰性的,僅在條件為 true 時才會被渲染到 DOM 中。初始狀態下,元素可能不在 DOM 結構中。
  1. 條件更新
  • v-show:只根據表達式的值來切換元素的顯示和隱藏,當表達式的值為 true 時元素顯示,為 false 時元素隱藏。元素的 DOM 結構一直保持存在,只是 CSS 的 display 屬性在切換顯示狀態。
  • v-if:根據條件表達式的真假動態創建或銷毀元素及其對應的 DOM 結構。當條件為 true 時元素渲染到 DOM 中,為 false 時元素從 DOM 中移除。
  1. 性能影響
  • v-show:由于元素始終存在于 DOM 中,只是通過修改 CSS 的 display 屬性來控制顯示和隱藏,所以切換顯示狀態的性能開銷較小。
  • v-if:根據條件動態地創建和銷毀元素及其 DOM 結構,切換顯示狀態時會有一定的性能開銷。如果需要頻繁切換顯示狀態或對性能要求較高的情況下,可以考慮使用 v-show 替代 v-if。

綜上所述,v-show 適用于頻繁切換顯示狀態的元素,而 v-if 適用于在條件變化時動態地創建或銷毀元素。根據具體需求和性能考慮,選擇適合的指令來控制元素的顯示和隱藏。

四、v-show 與 v-if 的使用場景

使用 v-show 的場景:

  1. 需要頻繁切換顯示狀態的元素:由于 v-show 只是通過修改 display 屬性來隱藏或顯示元素,因此適用于需要頻繁切換顯示狀態的情況,不會造成大量 DOM 元素的創建和銷毀。
  2. 對性能要求較高的場景:相比于 v-ifv-show 的渲染開銷較小,因為元素并不會被頻繁地創建和銷毀,適用于對性能要求較高的場景。

使用 v-if 的場景:

  1. 需要條件渲染的復雜組件:如果一個組件的渲染邏輯比較復雜,包含大量的子組件、計算屬性等,可以使用 v-if 來根據條件動態地創建或銷毀該組件,以減少不必要的渲染開銷。
  2. 需要延遲加載的組件:使用 v-if 可以將組件按需加載,只在需要的時候才進行渲染,可以提升初始加載性能和減少資源占用。
  3. 需要在 DOM 中完全移除元素的場景:由于 v-if 會在條件為假時將元素從 DOM 中移除,適用于需要完全移除元素的場景,節省DOM空間和資源占用。

綜上所述,v-show 適用于頻繁切換顯示狀態的元素和對性能要求較高的場景,而 v-if 適用于需要條件渲染、延遲加載或完全移除元素的場景。根據具體的需求和性能考慮,選擇合適的指令來控制元素的顯示與隱藏。

五、v-show 與 v-if 的優缺點

v-show

優點:

  • 元素始終存在于 DOM 結構中,只是通過修改 CSS 的 display 屬性來控制顯示和隱藏,因此切換顯示狀態的性能開銷較小。
  • 不會重復渲染元素,因為元素始終存在于 DOM 結構中,適用于頻繁切換顯示狀態的元素。

缺點:

  • 在元素較多時,可能會對頁面性能產生負面影響,因為這些元素仍然存在于 DOM 中。

v-if

優點:

  • 根據條件表達式的真假動態創建或銷毀元素及其對應的 DOM 結構,因此可以在需要時減少頁面中 DOM 元素的數量,提高頁面性能。
  • 在顯示狀態切換時避免了重復渲染,因此更適合對性能要求較高的場景。

缺點:

  • 在頻繁切換顯示狀態時,會進行創建和銷毀元素及其對應的 DOM 結構,這會帶來一定的性能開銷。
  • 如果使用 v-if 控制的元素在頁面中出現的次數很多,就需要頻繁的創建和銷毀大量的 DOM 元素,可能會對頁面的性能產生不利影響。

綜上所述,v-show 適合需要頻繁切換顯示狀態的元素,而 v-if 適合在條件變化時動態地創建或銷毀元素。具體使用哪種方式,還需要根據具體的業務情況和性能需求來進行選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214866.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214866.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214866.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kafka rebalance(再均衡)導致的消息積壓分析

起因&#xff1a; 某天&#xff0c;項目組收到大量的kafka消息積壓告警。查看了kafka日志后&#xff0c;發現 kafka不斷地 rebalance(再均衡)。 Rebalance (再均衡)&#xff1a; 分區的所有權從一個消費者轉移到另一個消費者&#xff0c;這樣的行為被稱為Rebalance (再均衡)…

修改汽車的控制系統實現自動駕駛,基于一個開源的汽車駕駛輔助系統實現全自動駕駛

修改汽車的控制系統實現自動駕駛,基于一個開源的汽車駕駛輔助系統實現全自動駕駛。 自動駕駛汽車依靠人工智能、視覺計算、雷達、監控裝置和全球定位系統協同合作,讓電腦可以在沒有任何人類主動的操作下,自動安全地操作機動車輛。 演示視頻: Openpilot :一個開源的汽車駕…

Socks5代理與代理IP的技術創新

隨著全球市場的開放和跨界電商的崛起&#xff0c;企業在出海過程中面臨著復雜多變的網絡環境和地域限制。在這一背景下&#xff0c;Socks5代理和代理IP等技術應運而生&#xff0c;成為助力企業突破網絡壁壘、實現出海目標的重要工具。本文將深入探討Socks5代理和代理IP在跨界電…

OpenSSL 3.x爆出漏洞,如何妥善應對?

10月25日&#xff0c;OpenSSL項目團隊發布了OpenSSL 3.x版中一個關鍵安全漏洞的修復程序。該修復程序已于11月1日正式發布。 由于OpenSSL有著極為廣泛的使用&#xff0c;該公告引起了很大反響。Akamai希望能通過本文幫助相關用戶了解情況&#xff0c;介紹有關檢測和緩解威脅的…

怎么消除視頻中所有的聲音?方法很簡單

當我們想把視頻中去掉聲音&#xff0c;可能有多種原因&#xff0c;也許需要制作一個無聲視頻&#xff0c;或者想在視頻中添加自己的音樂或解說&#xff0c;特別是一些搞笑解說&#xff0c;無論原因是什么&#xff0c;到底要怎么把視頻中所有的聲音都去除呢&#xff1f; 小編給…

計算機畢業設計 基于Web的網上購物系統(pc端仿淘寶系統)的設計與實現 Java實戰項目 附源碼+文檔+視頻講解

博主介紹&#xff1a;?從事軟件開發10年之余&#xff0c;專注于Java技術領域、Python人工智能及數據挖掘、小程序項目開發和Android項目開發等。CSDN、掘金、華為云、InfoQ、阿里云等平臺優質作者? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精…

SVN優缺點詳解及版本控制系統選型建議

Subversion (SVN)是目前可用的眾多版本控制選項之一。本篇文章將全面概述什么是 SVN、SVN的歷史、SVN存儲庫是什么&#xff0c;以及在切換到SVN之前您應該謹慎考慮的潛在問題。 什么是Subversion&#xff08;SVN&#xff09;&#xff1f; Subversion軟件&#xff0c;也稱為SV…

管理類聯考——數學——真題篇——按知識分類——代數

文章目錄 2023真題(2023-09)-代數-一元二次方程-注意絕對值的有效性真題(2023-17)-代數-一元二次方程-舉反例真題(2023-18)-數列-等比數列真題(2023-24)-數列-等比數列2022真題(2022-03)-代數-整式-因式分解真題(2022-19)-數列-等比數列真題(2022-21)-數列-等比數…

Docker的常用命令(沒有廢話)

目錄 鏡像 鏡像管理命令 鏡像構建命令 鏡像標簽和推送命令 其他命令 容器 運行容器 停止和刪除容器 查看容器信息 進入容器 數據卷 列出卷 創建和刪除卷 將卷掛載到容器 鏡像 鏡像管理命令 docker images # 列出本地所有的鏡像 docker search <關鍵詞> #…

使用pe安裝windows操作系統

一、系統安裝前準備工作&#xff0c;制作系統盤 &#xff08;1&#xff09;拷貝電腦上的資料 &#xff08;2&#xff09;準備一個至少8G的U盤 &#xff08;3&#xff09;下載windows鏡像文件及pe軟件 通過百度網盤可下載下列軟件及鏡像 windows鏡像文件&#xff08;百度網盤…

知識筆記(五十二)———MySQL 安裝

Linux/UNIX 上安裝 MySQL Linux平臺上推薦使用RPM包來安裝Mysql,MySQL AB提供了以下RPM包的下載地址&#xff1a; MySQL - MySQL服務器。你需要該選項&#xff0c;除非你只想連接運行在另一臺機器上的MySQL服務器。MySQL-client - MySQL 客戶端程序&#xff0c;用于連接并操作…

Kotlin 中的 `as` 關鍵字:類型轉換的藝術

在 Android 編程中&#xff0c;類型轉換是一項常見的操作。為了使這一過程更加流暢和安全&#xff0c;Kotlin 提供了 as 關鍵字。本文將深入探討 as 關鍵字的用法和最佳實踐。 一、as 關鍵字的基本概念 &#x1f680; as 關鍵字在 Kotlin 中用于顯式類型轉換。它將一個表達式…

vue零基礎

vue 與其他框架的對比 框架設計模式數據綁定靈活度文件模式復雜性學習曲線生態VueMVVM雙向靈活單文件小緩完善ReactMVC單向較靈活all in js大陡豐富AngularMVC雙向固定多文件較大較陡&#xff08;Typescript&#xff09;獨立 更多對比細節&#xff1a;vue 官網&#xff1a;ht…

matplotlib繪圖時show函數需在save函數后

matplotlib繪圖時&#xff0c;先調用show&#xff0c;后調用save函數保存圖像&#xff0c;否則無法保存圖像信息 figsize 23,10 #fig, axes plt.subplots(nrows1, ncols2) fig, axs plt.subplots(4, 3, sharexcol,shareyrow,figsizefigsize) # 在每個子圖中繪制一個圖形 pi…

2023-12-05 Qt學習總結3

點擊 <C 語言編程核心突破> 快速C語言入門 Qt學習總結 前言九 QObject基類十 QWidget基類十一 QMainWindow類總結 前言 要解決問題: 學習qt最核心知識, 多一個都不學. 九 QObject基類 QObject是Qt中最基本的類&#xff0c;所有Qt中的對象都從該基類派生而來。 QObjec…

Hbase2.5.5分布式部署安裝記錄

文章目錄 1 環境準備1.1 節點部署情況1.2 安裝說明 2 Hbase安裝過程Step1&#xff1a;Step2:Step3:Step4&#xff1a; 3 Web UI檢查狀態并測試3.1 Web UI3.2 創建測試命名空間 1 環境準備 1.1 節點部署情況 Hadoop11&#xff1a;Hadoop3.1.4 、 zookeeper3.4.6、jdk8 Hadoop1…

JOSEF 靜態延時中間繼電器 JZS-7G/42 DC110V 導軌安裝

系列型號&#xff1a; JZS-7G-57端子排延時中間繼電器&#xff1b; JZS-7G-42X端子排延時中間繼電器&#xff1b; JZS-7G-22X端子排延時中間繼電器&#xff1b; JZS-7G-21端子排延時中間繼電器&#xff1b; JZS-7G-41端子排延時中間繼電器&#xff1b; JZS-7G-51端子排延…

git bash查看遠程倉庫地址

進入代碼路徑 git remote -vgit remote -v

MySQL執行語句 Table ‘mysql.servers‘ doesn‘t exist

執行語句報錯&#xff1a; mysql> flush privileges; ERROR 1146 (42S02): Table mysql.servers doesnt exist解決&#xff1a; 進入數據庫 刪除servers表 mysql> use mysql Database changed mysql> drop table if exists servers; Query OK, 0 rows affected, …

IoTDB服務安裝教程-單機版

文章目錄 單機版&#xff08;試用&#xff09;下載地址安裝環境安裝JDK設置最大文件打開數為 65535 安裝服務目錄結構如下啟動 IoTDB使用 Cli 工具IoTDB 的基本操作創建數據庫查看所有數據庫創建時間序列插入時間序列數據查詢數據退出會話 停止 IoTDB 單機版&#xff08;試用&a…