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對象拼裝render和staticRenderFns函數
- render和staticRenderFns函數被調用后生成虛擬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 原理
-
解析階段:在編譯模板過程中,當遇到帶有 v-if 指令的元素時,會將該指令解析成一個對應的 Vue 實例中的 _directive 對象。
-
渲染階段:當 Vue 實例進行渲染時,會通過指令對象的 bind 方法來初始化指令,并根據條件表達式的值判斷是否渲染元素。如果條件為真,則創建并插入元素及其 DOM 結構到父元素中;如果條件為假,則移除元素及其 DOM 結構。
-
更新階段:當條件表達式的值發生變化時,Vue 實例會通過指令對象的 update 方法來更新元素的顯示狀態。如果條件從假變為真,則創建并插入元素及其 DOM 結構;如果條件從真變為假,則移除元素及其 DOM 結構。
-
銷毀階段:當 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-show 和 v-if 都是 Vue 框架中用于控制元素顯示/隱藏的指令。
- 都可以通過一個布爾類型的條件表達式來判斷是否渲染元素。
- 在條件為假時,不會顯示元素。
- 在條件為真時,會顯示元素。
- 當條件表達式的值發生變化時,都可以更新元素的顯示狀態。
三、v-show 與 v-if 的區別
- 狀態初始化:
- v-show:元素一開始會被渲染到 DOM 中,并且可以通過 CSS 的 display 屬性進行顯示和隱藏。初始狀態下,元素始終存在于 DOM 結構中。
- v-if:元素的渲染是惰性的,僅在條件為 true 時才會被渲染到 DOM 中。初始狀態下,元素可能不在 DOM 結構中。
- 條件更新:
- v-show:只根據表達式的值來切換元素的顯示和隱藏,當表達式的值為 true 時元素顯示,為 false 時元素隱藏。元素的 DOM 結構一直保持存在,只是 CSS 的 display 屬性在切換顯示狀態。
- v-if:根據條件表達式的真假動態創建或銷毀元素及其對應的 DOM 結構。當條件為 true 時元素渲染到 DOM 中,為 false 時元素從 DOM 中移除。
- 性能影響:
- v-show:由于元素始終存在于 DOM 中,只是通過修改 CSS 的 display 屬性來控制顯示和隱藏,所以切換顯示狀態的性能開銷較小。
- v-if:根據條件動態地創建和銷毀元素及其 DOM 結構,切換顯示狀態時會有一定的性能開銷。如果需要頻繁切換顯示狀態或對性能要求較高的情況下,可以考慮使用 v-show 替代 v-if。
綜上所述,v-show 適用于頻繁切換顯示狀態的元素,而 v-if 適用于在條件變化時動態地創建或銷毀元素。根據具體需求和性能考慮,選擇適合的指令來控制元素的顯示和隱藏。
四、v-show 與 v-if 的使用場景
使用 v-show 的場景:
- 需要頻繁切換顯示狀態的元素:由于 v-show 只是通過修改 display 屬性來隱藏或顯示元素,因此適用于需要頻繁切換顯示狀態的情況,不會造成大量 DOM 元素的創建和銷毀。
- 對性能要求較高的場景:相比于 v-if,v-show 的渲染開銷較小,因為元素并不會被頻繁地創建和銷毀,適用于對性能要求較高的場景。
使用 v-if 的場景:
- 需要條件渲染的復雜組件:如果一個組件的渲染邏輯比較復雜,包含大量的子組件、計算屬性等,可以使用 v-if 來根據條件動態地創建或銷毀該組件,以減少不必要的渲染開銷。
- 需要延遲加載的組件:使用 v-if 可以將組件按需加載,只在需要的時候才進行渲染,可以提升初始加載性能和減少資源占用。
- 需要在 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 適合在條件變化時動態地創建或銷毀元素。具體使用哪種方式,還需要根據具體的業務情況和性能需求來進行選擇。