日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

vue實現(xiàn)骨架屏的示例

瀏覽:22日期:2022-09-30 14:38:19
骨架屏用途 作為spa中路由切換的 loading, 結(jié)合組件的生命周期和ajax請求返回的時機來使用.( 作為loading 使用)。作為與用戶聯(lián)系最為密切的前端開發(fā)者,用戶體驗是最值得關(guān)注的問題。關(guān)于頁面loading狀態(tài)的展示,主流的主要有l(wèi)oading圖和進度條兩種。除此之外,越來越多的APP采用了“骨架屏”的方式去展示未加載內(nèi)容,給予了用戶煥然一新的體驗。 作為首屏渲染的優(yōu)化 Vue架構(gòu)骨架屏思路大綱 定義一個抽象組件,在抽象組件的render函數(shù)里獲取插槽 深度循環(huán)遍歷插槽,將每個元素都添加上gm-skeleton的類名 將vnode textContent預(yù)暫后清空保證骨架屏出現(xiàn)時不會出現(xiàn)默認文字 返回slots 定義一個抽象組件

什么是抽象組件? 在渲染時會被跳過,只做運行時的操作的組件

export default { name: ’GmSkeleton’, abstract: true // 抽象組件的屬性 }獲取插槽并初始化操作骨架屏

render(h) { const slots = this.$slots.default || [h(’’)] this.$nextTick().then(() => {this.handlerPrefix(slots, this.showSpin ? this.addSkeletPrefix : this.removeSkeletPrefix) }) return slots.length > 1 ? h(’div’, { staticClass: this.showSpin ? ’g-spinner’ : ’’ }, slots) : slots }

這里我們將處理slots的方法放置在nextTick里面, 因為handlerPrefix里需要獲取真實的DOM,nextTick是用來執(zhí)行排序后的更新隊列里的所有方法, 在執(zhí)行render前, GMSkeleton組件的renderWatcher已被收集到更新隊列里,所以此時定義nextTick CallBack函數(shù)里能獲取到渲染后對應(yīng)插槽里所有真實DOM,若是不了解nextTick原理,請移步你不知道的nextTick

循環(huán)slots操作類名

handlerComponent(slot, handler/* addSkeletPrefix | removeSkeletPrefix */, init) { const originchildren = (((slot.componentInstance || {})._vnode || {}).componentOptions || {}).children const compchildren = ((slot.componentInstance || {})._vnode || {}).children !init && handler(slot) if (compchildren) this.handlerPrefix(compchildren, handler, false) if (originchildren) this.handlerPrefix(originchildren, handler, false) }, handlerPrefix(slots, handler, init = true) { slots.forEach(slot => {var children = slot.children || (slot.componentOptions || {}).children || ((slot.componentInstance || {})._vnode || {}).childrenif (slot.data) { if (!slot.componentOptions) { !init && handler(slot) } else if (!this.$hoc_utils.getAbstractComponent(slot)) { ;(function(slot) { const handlerComponent = this.handlerComponent.bind(this, slot, handler, init) const insert = (slot.data.hook || {}).insert ;(slot.data.hook || {}).insert = () => { // 函數(shù)重構(gòu), 修改原有的組件hook, 并且保證insert只執(zhí)行一次insert(slot)handlerComponent() } ;(slot.data.hook || {}).postpatch = handlerComponent }).call(this, slot) }}if (slot && slot.elm && slot.elm.nodeType === 3) { if (this.showSpin) { slot.memorizedtextContent = slot.elm.textContent slot.elm.textContent = ’’ } else { slot.elm.textContent = slot.memorizedtextContent || slot.elm.textContent || slot.text }}children && this.handlerPrefix(children, handler, false) }) },

逐步分析:

我們遍歷slots插槽 獲取當前vnode下的children集合以備做下一次循環(huán) 判斷是否是原生HTML元素,只有組件vnode才會具備componentOptions屬性 判斷是否抽象組件,我們知道抽象組件是不會渲染到真實DOMTree上的,例如keep-alive、transition,每個組件的vnode擁有獨有的hooks生命周期: init(初始化)、insert(插入)、prepatch(更新)、destroy(銷毀),每個生命周期會在不同階段觸發(fā), 劫持insert,保留原有的insert方法,隨后重構(gòu)vnode的insert方法在里面調(diào)用handlerComponent方法進行添加類名,這里與上面的mounted的nextTick用法理念類似,由于handlerComponent需要知道子組件的實例,所以必須在實例化后去調(diào)用,而組件的init方法會實例組件并且直接調(diào)用watcher.update(watcher.render()), 也就是我們在調(diào)用insert方法的時候其實是在update(render())后,所以這里能夠獲取到實例化后子組件 判斷nodeType是否是文本節(jié)點,若是的話需要先將textContent保存后進行刪除,保證在骨架屏出現(xiàn)時不會顯示默認文字,在骨架屏消失時,將原先保留的默認文字返回給vnode,這樣就能自由在骨架屏的顯示隱藏期間自由切換 操作vnode的靜態(tài)類名

addSkeletPrefix(slot) { const rootVnode = slot.componentOptions ? (slot.componentInstance || {})._vnode || {} : slot; if (rootVnode.elm) {rootVnode.elm.classList.add(this.skeletPrefix) } else {;(rootVnode.data || {}).staticClass += ` ${this.skeletPrefix}` } }, removeSkeletPrefix(slot) { const rootVnode = slot.componentOptions ? (slot.componentInstance || {})._vnode || {} : slot; if (rootVnode.elm) {rootVnode.elm.classList && rootVnode.elm.classList.remove(this.skeletPrefix) } else if (rootVnode.data.staticClass) {rootVnode.data.staticClass = rootVnode.data.staticClass.replace(` ${this.skeletPrefix}`, ’’) } }

addSkeletePrefix用于添加gm-skeleton類名,而removeSkeletonPrefix則是用于刪除gm-skeleton類名

使用方法

import Vue from ’vue’ import GMSkeleton from ’path/to/GMSkeleton’ Vue.use(GMSkeleton)

<gm-skeleton> <Component /> <div></div> <div><span>前端馬丁</span></div> </gm-skeleton>傳值

屬性名 值 描述 showSpin Boolean 是否開啟骨架屏,默認為true skeletPrefix String 骨架屏類名, 默認是gm-skeleton

效果如下

具體樣式是根據(jù)開發(fā)者自己寫的樣式來生成的,通過gm-skeleton包裹,如上的使用方法,以下是一個簡單的例子

vue實現(xiàn)骨架屏的示例

完整地址

80行代碼實現(xiàn)Vue骨架屏

以上就是vue實現(xiàn)骨架屏的示例的詳細內(nèi)容,更多關(guān)于vue實現(xiàn)骨架屏的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品一页| 日韩精品麻豆| 三级精品视频| 国产毛片久久久| 视频一区视频二区中文字幕| 美女一区网站| 久久精品99国产精品日本| 成人精品天堂一区二区三区| 国产精品高清一区二区| 久久亚洲电影| 国精品一区二区三区| 亚洲黄色中文字幕| 亚洲精品影视| 亚洲成av在线| 精品国产午夜肉伦伦影院| 欧美在线观看天堂一区二区三区| 亚洲成av人片一区二区密柚| 美女视频黄 久久| 日韩高清不卡一区| 先锋影音久久久| 美女亚洲一区| 激情婷婷欧美| 激情黄产视频在线免费观看| 麻豆国产一区| 麻豆91小视频| 久久福利在线| 色天使综合视频| 免播放器亚洲一区| 国产欧美日韩精品高清二区综合区 | 国产综合亚洲精品一区二| 国产精品婷婷| 欧美一区免费| 国产aⅴ精品一区二区四区| 色婷婷精品视频| 日韩中文字幕不卡| 国产极品久久久久久久久波多结野| 美女视频一区在线观看| 不卡福利视频| 视频在线观看一区二区三区| 久久激情综合网| 中文字幕人成乱码在线观看| 99国产精品私拍| 日韩欧美四区| 成人精品视频| 视频一区中文字幕国产| 国产精品s色| 国产在线不卡| 欧美亚洲色图校园春色| 黑森林国产精品av| 蜜桃视频在线观看一区二区| 欧美国产日韩电影| 日韩欧美自拍| 国内精品福利| 日韩激情综合| 高潮一区二区| 日韩高清欧美激情| 日本精品影院| 久久精品99国产精品日本| 色网在线免费观看| 日韩精品一区二区三区中文字幕| 日韩在线短视频| 无码日韩精品一区二区免费| 欧洲精品一区二区三区| 日本va欧美va瓶| 黑丝美女一区二区| 精品国产99| 在线日韩成人| 日韩伦理一区| 国产精品丝袜在线播放| 亚洲激情二区| 成人精品久久| 日韩免费精品| 视频福利一区| 国产精品一区二区三区av| 免费视频亚洲| 久久午夜影院| 日日夜夜免费精品视频| 久久精品动漫| 欧美黄色一区| 天堂va在线高清一区| 在线国产一区二区| 成人免费电影网址| 国产一级久久| 国产91久久精品一区二区| 欧美好骚综合网| 狠狠色狠狠色综合日日tαg| 一本色道精品久久一区二区三区| 激情视频网站在线播放色| 色欧美自拍视频| 亚洲女人av| 国产一区二区三区四区大秀| 久久香蕉精品| 免费在线观看视频一区| 麻豆精品视频在线| 美女久久一区| 国产精品观看| 国产精品日本| 欧美在线影院| 国产一区日韩| 日韩精品一区第一页| 麻豆传媒一区二区三区| 久久99精品久久久野外观看| 国产精品片aa在线观看| 91看片一区| 欧美久久久网站| 欧美国产另类| 国产精品欧美在线观看| 久久久久亚洲| 亚洲免费影视| 91精品国产调教在线观看| 69堂精品视频在线播放| 久久亚洲影院| 在线日韩成人| 亚洲成人三区| 日韩精品三区四区| 久久九九电影| 捆绑调教美女网站视频一区 | 男人操女人的视频在线观看欧美| 亚洲1234区| 国产精品久久久久av电视剧| 精品一区二区三区中文字幕| 国产精品2023| 老牛国内精品亚洲成av人片| 久久不见久久见中文字幕免费| 97成人在线| 亚洲我射av| 亚洲18在线| 日韩激情av在线| 日韩av不卡在线观看| 日韩不卡手机在线v区| 在线视频亚洲欧美中文| 亚洲精品伊人| 日韩精品视频网| 欧美在线日韩| 久久精品国产福利| 日韩1区2区| 日韩精品麻豆| 亚洲欧美日韩精品一区二区| 国产精品普通话对白| 伊人久久一区| 欧美日韩va| 久久99久久人婷婷精品综合| 国产精品115| 国产精品99一区二区三| 亚洲精品一区三区三区在线观看| 天堂√中文最新版在线| 久久久精品日韩| av不卡在线看| 亚洲精选av| 国产精品成人3p一区二区三区| 欧美国产不卡| 最新中文字幕在线播放| 99免费精品| 亚洲精品三级| 视频在线不卡免费观看| 99成人在线| 亚洲福利国产| 国产精品久久久久久久久久妞妞| 免费亚洲一区| 国产精品密蕾丝视频下载| 日韩av字幕| 精品视频网站| 婷婷亚洲五月| 成人久久一区| 在线成人直播| 亚洲一区黄色| 中文一区二区| 99riav国产精品| 国产欧美91| 美女亚洲一区| 最近国产精品视频| 欧美~级网站不卡| 日本三级亚洲精品| 亚洲欧洲专区| 99精品美女| 国产成人精品一区二区三区免费| 午夜欧美精品久久久久久久| 99视频在线精品国自产拍免费观看| 亚洲性图久久| 久久精品福利| 亚洲开心激情| 99精品在线观看| 亚洲日本三级| 精品三区视频| av亚洲在线观看| 日韩精品1区2区3区| а√在线中文在线新版| 亚洲精品在线a| 日韩二区在线观看| 国产欧美日韩免费观看| 日韩精品a在线观看91| 欧美一级二区| 国产亚洲福利| 美女少妇全过程你懂的久久| 亚洲视频二区| 国产高清精品二区| 一区二区三区四区在线观看国产日韩| 视频在线观看一区| 亚洲综合精品| 欧美一区二区三区高清视频|