<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們都知道在 vue
中 v-show
與 v-if
的作用效果是相同的(不含v-else),都能控制元素在頁面是否顯示
在用法上也是相同的:
<Model v-show="isShow" /> <Model v-if="isShow" />
true
的時候,都會佔據頁面的位置false
時,都不會佔據頁面位置v-show
隱藏則是為該元素新增css--display:none
,dom
元素依舊還在。v-if
顯示隱藏是將dom
元素整個新增或刪除v-if
切換有一個區域性編譯/解除安裝的過程,切換過程中合適地銷燬和重建內部的事件監聽和子元件;v-show
只是簡單的基於css切換v-if
是真正的條件渲染,它會確保在切換過程中條件塊內的事件監聽器和子元件適當地被銷燬和重建。只有渲染條件為假時,並不做操作,直到為真才渲染v-show
由false
變為true
的時候不會觸發元件的生命週期v-if
由false
變為true
的時候,觸發元件的beforeCreate
、create
、beforeMount
、mounted
勾點,由true
變為false
的時候觸發元件的beforeDestory
、destoryed
方法v-if
有更高的切換消耗;v-show
有更高的初始渲染消耗;具體解析流程這裡不展開講,大致流程如下:
template
轉為ast
結構的JS
物件ast
得到的JS
物件拼裝render
和staticRenderFns
函數render
和staticRenderFns
函數被呼叫後生成虛擬VNODE
節點,該節點包含建立DOM
節點所需資訊vm.patch
函數通過虛擬DOM
演演算法利用VNODE
節點建立真實DOM
節點不管初始條件是什麼,元素總是會被渲染
我們看一下在vue
中是如何實現的
程式碼很好理解,有transition
就執行transition
,沒有就直接設定display
屬性
// https://github.com/vuejs/vue-next/blob/3cd30c5245da0733f9eb6f29d220f39c46518162/packages/runtime-dom/src/directives/vShow.ts export const vShow: ObjectDirective<VShowElement> = { beforeMount(el, { value }, { transition }) { el._vod = el.style.display === 'none' ? '' : el.style.display if (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-show
要複雜的多,因為還有else
else-if
等條件需要處理,這裡我們也只摘抄原始碼中處理 v-if
的一小部分
返回一個node
節點,render
函數通過表示式的值來決定是否生成DOM
// https://github.com/vuejs/vue-next/blob/cdc9f336fd/packages/compiler-core/src/transforms/vIf.ts export const transformIf = createStructuralDirectiveTransform( /^(if|else|else-if)$/, (node, dir, context) => { return processIf(node, dir, context, (ifNode, branch, isRoot) => { // ... return () => { if (isRoot) { ifNode.codegenNode = createCodegenNodeForBranch( branch, key, context ) as IfConditionalExpression } else { // attach this branch's codegen node to the v-if root. const parentCondition = getParentCondition(ifNode.codegenNode!) parentCondition.alternate = createCodegenNodeForBranch( branch, key + ifNode.branches.length - 1, context ) } } }) } )
v-if
與 v-show
都能控制dom
元素在頁面的顯示
v-if
相比 v-show
開銷更大的(直接操作dom
節點增加與刪除)
到此這篇關於v-show和v-if的區別 及應用場景的文章就介紹到這了,更多相關v-show和v-if 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45