最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

v-show?和?v-if?的區(qū)別及使用場景分析

 更新時間:2025年09月20日 09:20:37   作者:那一抹陽光多燦爛  
v-show通過CSS控制顯示隱藏,保持DOM元素,適合頻繁切換;v-if根據(jù)條件生成/銷毀DOM,影響生命周期,適用于靜態(tài)條件,兩者在性能、渲染方式及組件狀態(tài)管理上有顯著差異,需根據(jù)具體場景選擇,本文通過實例代碼解析v-show和v-if的區(qū)別及使用,感興趣的朋友一起看看吧

v-show 和 v-if 的區(qū)別及使用場景

一、v-show 與 v-if 的共同點(diǎn)

兩者都能控制元素在頁面中的顯示與隱藏(不包括 v-else 情況),且用法相同:

<Model v-show="isShow" />
<Model v-if="isShow" />

當(dāng)表達(dá)式為 true 時,元素都會占據(jù)頁面位置;為 false 時,都不會占據(jù)位置。

二、v-show 與 v-if 的區(qū)別

v-show 和 v-if 的區(qū)別核心區(qū)別

特性v-ifv-show
渲染機(jī)制條件為真時渲染元素,否則銷毀始終渲染元素,通過 CSS 控制顯示
DOM 操作動態(tài)添加/移除 DOM 元素僅切換 display: none 樣式
初始開銷低(條件為假時不渲染)高(無論條件如何都渲染)
切換開銷高(涉及組件銷毀/重建)低(僅修改 CSS 屬性)
組件生命周期觸發(fā) created/mounted 等鉤子函數(shù)不觸發(fā)生命周期鉤子(始終存在)
組合使用支持 v-else-ifv-else無邏輯分支語法
  • 控制方式不同
    • v-show 通過添加 CSS display: none 隱藏元素,DOM 元素依然存在
    • v-if 會直接添加或刪除整個 DOM 元素
  • 編譯過程不同
    • v-if 有局部編譯/卸載過程,會銷毀和重建內(nèi)部事件監(jiān)聽及子組件
    • v-show 僅進(jìn)行簡單的 CSS 切換
  • 生命周期影響
    • v-show 狀態(tài)變化不會觸發(fā)組件生命周期
    • v-if 從 false 變?yōu)?true 會觸發(fā) beforeCreate、created、beforeMount、mounted 鉤子;從 true 變?yōu)?false 會觸發(fā) beforeDestroy、destroyed
  • 性能消耗
    • v-if 切換開銷更大
    • v-show 初始渲染開銷更大

三、實現(xiàn)原理分析

v-show 原理

無論初始條件如何,元素都會被渲染。其實現(xiàn)邏輯:

  1. 有 transition 時執(zhí)行 transition 動畫
  2. 無 transition 時直接設(shè)置 display 屬性
// Vue 3 的 v-show 指令實現(xiàn)
export const vShow: ObjectDirective<VShowElement> = {
    // 在元素掛載到 DOM 之前執(zhí)行
    beforeMount(el, { value }, { transition }) {
      // 保存元素的原始 display 值,用于后續(xù)恢復(fù)
      // 如果當(dāng)前是隱藏狀態(tài)(display: none),則保存空字符串
      // 否則保存當(dāng)前的 display 值
      el._vod = el.style.display === 'none' ? '' : el.style.display
      // 如果存在過渡動畫且值為真(顯示元素)
      if (transition && value) {
        // 執(zhí)行過渡動畫的進(jìn)入前鉤子
        transition.beforeEnter(el)
      } else {
        // 否則直接設(shè)置元素的顯示狀態(tài)
        setDisplay(el, value)
      }
    },
    // ...其他生命周期處理(如 mounted, beforeUpdate, updated, beforeUnmount 等)
  }

v-if 原理

實現(xiàn)更為復(fù)雜,根據(jù)表達(dá)式值決定是否生成 DOM:

// Vue 3 的 v-if 指令轉(zhuǎn)換器
export const transformIf = createStructuralDirectiveTransform(
    // 匹配 v-if、v-else、v-else-if 指令的正則表達(dá)式
    /^(if|else|else-if)$/,
    // 轉(zhuǎn)換函數(shù),處理條件指令的 AST 節(jié)點(diǎn)
    (node, dir, context) => {
      // 調(diào)用 processIf 函數(shù)處理條件分支邏輯
      return processIf(node, dir, context, (ifNode, branch, isRoot) => {
        // 條件分支處理邏輯
        // ifNode: 當(dāng)前處理的 if 節(jié)點(diǎn)
        // branch: 當(dāng)前分支(if/else-if/else)
        // isRoot: 是否為根節(jié)點(diǎn)
      })
    }
  )

四、使用場景建議

  1. 頻繁切換場景 推薦使用 v-show
    適用于需要快速響應(yīng)的交互元素:
  • Tab 切換內(nèi)容
  • 下拉菜單/折疊面板
  • 頻繁開閉的 Modal 彈窗
  1. 靜態(tài)條件場景 推薦使用 v-if
    適用于內(nèi)容較重且不常變更的情況:
  • 根據(jù)用戶角色/權(quán)限加載的初始頁面模塊
  • 登錄狀態(tài)相關(guān)的按鈕/導(dǎo)航欄切換
  • 大數(shù)據(jù)列表/圖表等按需加載的組件

到此這篇關(guān)于v-show 和 v-if 的區(qū)別及使用場景的文章就介紹到這了,更多相關(guān)v-show 和 v-if 區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue如何在style標(biāo)簽中使用變量(數(shù)據(jù))詳解

    vue如何在style標(biāo)簽中使用變量(數(shù)據(jù))詳解

    在我們編寫css樣式中是不能直接使用vue data中的變量的,下面這篇文章主要給大家介紹了關(guān)于vue如何在style標(biāo)簽中使用變量(數(shù)據(jù))的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 基于Vue3+TypeScript實現(xiàn)抖音式卡片滑動交互功能

    基于Vue3+TypeScript實現(xiàn)抖音式卡片滑動交互功能

    本文介紹如何用 Vue 3 + TypeScript 實現(xiàn)類似抖音的卡片滑動交互,應(yīng)用于單詞記憶場景,完整方案包含手勢識別、堆疊動畫、實時反饋和狀態(tài)管理,需要的朋友可以參考下
    2026-06-06
  • 詳解VueJS應(yīng)用中管理用戶權(quán)限

    詳解VueJS應(yīng)用中管理用戶權(quán)限

    本篇文章主要給大家講述了VueJS應(yīng)用中管理用戶權(quán)限的詳細(xì)過程和方法,以及相關(guān)的代碼展示,需要的朋友參考下吧。
    2018-02-02
  • Vue.js 的 watch函數(shù)基本用法

    Vue.js 的 watch函數(shù)基本用法

    watch 函數(shù)是 Vue.js 提供的一個強(qiáng)大工具,用于響應(yīng)數(shù)據(jù)變化并執(zhí)行相應(yīng)的回調(diào),通過合理使用 watch 函數(shù),我們可以實現(xiàn)異步數(shù)據(jù)請求、表單驗證、動態(tài)樣式等多種功能,這篇文章主要介紹了Vue.js 的 watch函數(shù),需要的朋友可以參考下
    2024-08-08
  • vue配置接口域名方法總結(jié)

    vue配置接口域名方法總結(jié)

    在本篇文章里小編給大家分享了關(guān)于vue配置接口域名方法和相關(guān)知識點(diǎn)總結(jié),需要的朋友們跟著操作下。
    2019-05-05
  • 教你三分鐘掌握Vue過濾器filters及時間戳轉(zhuǎn)換

    教你三分鐘掌握Vue過濾器filters及時間戳轉(zhuǎn)換

    這篇文章教你三分鐘掌握Vue過濾器filters及時間戳轉(zhuǎn)換,本文將結(jié)合時間戳轉(zhuǎn)換的例子帶你快速了解filters的用法,需要的朋友可以參考下
    2023-03-03
  • vue中如何簡單封裝axios淺析

    vue中如何簡單封裝axios淺析

    Axios 毋庸多說大家在前端開發(fā)中常用的一個發(fā)送 HTTP 請求的庫,用過的都知道,篇文章主要給大家介紹了關(guān)于vue中如何簡單封裝axios的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • Vue 自定義組件 v-model 使用詳解

    Vue 自定義組件 v-model 使用詳解

    這篇文章主要介紹了Vue 自定義組件 v-model 使用介紹,包括vue2中使用和vue3中使用,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • vue進(jìn)入頁面加載數(shù)據(jù)緩慢實現(xiàn)loading提示過程

    vue進(jìn)入頁面加載數(shù)據(jù)緩慢實現(xiàn)loading提示過程

    這篇文章主要介紹了vue進(jìn)入頁面加載數(shù)據(jù)緩慢實現(xiàn)loading提示過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue.js中proxyTable 轉(zhuǎn)發(fā)請求的實現(xiàn)方法

    vue.js中proxyTable 轉(zhuǎn)發(fā)請求的實現(xiàn)方法

    今天小編就為大家分享一篇vue.js中proxyTable 轉(zhuǎn)發(fā)請求的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論

宜宾市| 社旗县| 济南市| 张家港市| 凤凰县| 高雄县| 伽师县| 永丰县| 安阳市| 合川市| 常德市| 霞浦县| 金华市| 云林县| 连州市| 富锦市| 久治县| 商丘市| 明水县| 金阳县| 韶关市| 大关县| 平山县| 青铜峡市| 连平县| 两当县| 会泽县| 楚雄市| 阳春市| 博野县| 阜阳市| 德昌县| 双鸭山市| 防城港市| 堆龙德庆县| 岑溪市| 广南县| 永宁县| 棋牌| 阳东县| 桂阳县|