欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

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

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

v-show 原理

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

  1. 有 transition 時(shí)執(zhí)行 transition 動(dòng)畫(huà)
  2. 無(wú) transition 時(shí)直接設(shè)置 display 屬性
// Vue 3 的 v-show 指令實(shí)現(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
      // 如果存在過(guò)渡動(dòng)畫(huà)且值為真(顯示元素)
      if (transition && value) {
        // 執(zhí)行過(guò)渡動(dòng)畫(huà)的進(jìn)入前鉤子
        transition.beforeEnter(el)
      } else {
        // 否則直接設(shè)置元素的顯示狀態(tài)
        setDisplay(el, value)
      }
    },
    // ...其他生命周期處理(如 mounted, beforeUpdate, updated, beforeUnmount 等)
  }

v-if 原理

實(shí)現(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ù),處理?xiàng)l件指令的 AST 節(jié)點(diǎn)
    (node, dir, context) => {
      // 調(diào)用 processIf 函數(shù)處理?xiàng)l件分支邏輯
      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)
      })
    }
  )

四、使用場(chǎng)景建議

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

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

相關(guān)文章

最新評(píng)論