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

您的位置:首頁技術文章
文章詳情頁

vue實現骨架屏的示例

瀏覽:23日期:2022-09-30 14:38:19
骨架屏用途 作為spa中路由切換的 loading, 結合組件的生命周期和ajax請求返回的時機來使用.( 作為loading 使用)。作為與用戶聯系最為密切的前端開發者,用戶體驗是最值得關注的問題。關于頁面loading狀態的展示,主流的主要有loading圖和進度條兩種。除此之外,越來越多的APP采用了“骨架屏”的方式去展示未加載內容,給予了用戶煥然一新的體驗。 作為首屏渲染的優化 Vue架構骨架屏思路大綱 定義一個抽象組件,在抽象組件的render函數里獲取插槽 深度循環遍歷插槽,將每個元素都添加上gm-skeleton的類名 將vnode textContent預暫后清空保證骨架屏出現時不會出現默認文字 返回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是用來執行排序后的更新隊列里的所有方法, 在執行render前, GMSkeleton組件的renderWatcher已被收集到更新隊列里,所以此時定義nextTick CallBack函數里能獲取到渲染后對應插槽里所有真實DOM,若是不了解nextTick原理,請移步你不知道的nextTick

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

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

效果如下

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

vue實現骨架屏的示例

完整地址

80行代碼實現Vue骨架屏

以上就是vue實現骨架屏的示例的詳細內容,更多關于vue實現骨架屏的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
夜夜嗨av一区二区三区网站四季av| 亚洲欧美在线综合| 日韩综合一区| 国产成人精品亚洲日本在线观看| 国产91精品对白在线播放| 蜜桃成人精品| 91久久午夜| 视频精品一区| 久久中文字幕导航| 婷婷激情一区| 免费日韩av片| 国产精品久久免费视频| 国产精品精品| 国产国产精品| 日韩avvvv在线播放| 国产精品mv在线观看| 激情黄产视频在线免费观看| 国产在线日韩| 日韩av中文在线观看| 国产中文字幕一区二区三区| 欧美成人精品三级网站| 巨乳诱惑日韩免费av| 麻豆一区二区三| 美女毛片一区二区三区四区| 日韩激情视频网站| 久久电影tv| 蜜臀91精品一区二区三区| 国产精品嫩模av在线| 伊人久久高清| 亚洲精品少妇| 国产成人精品免费视| 国产精品美女久久久浪潮软件| 日韩av网站在线免费观看| 亚洲播播91| 青草av.久久免费一区| 中文字幕在线看片| 午夜电影一区| 久久蜜桃av| 欧美日韩中出| 免费av一区二区三区四区| 91欧美日韩在线| 国产精品久久久久av蜜臀 | 久久不卡日韩美女| 麻豆成全视频免费观看在线看| 国产调教一区二区三区| 久久av综合| 久久亚洲风情| 日本欧美不卡| 麻豆极品一区二区三区| 日韩欧美激情| 日韩和欧美的一区| 中文字幕色婷婷在线视频| 午夜在线播放视频欧美| 久久不卡日韩美女| 日韩精品一区二区三区免费视频| 久久伊人国产| 亚洲丝袜啪啪| 极品日韩av| 国产精品久久久久久久久久10秀| 奇米色欧美一区二区三区| 蜜桃国内精品久久久久软件9| 国产精品流白浆在线观看| 婷婷综合六月| 久久国产乱子精品免费女| 国内一区二区三区| 日韩精品一二三四| 女人天堂亚洲aⅴ在线观看| 视频一区视频二区中文字幕| 高清不卡亚洲| 国产精品xxx在线观看| 亚洲美女91| 99国产成+人+综合+亚洲欧美| 欧美一级鲁丝片| 精品中国亚洲| 国产精品一国产精品| 亚洲精选久久| 久久大逼视频| 伊人成人网在线看| 久久久久久久久久久妇女| 国产精品丝袜在线播放| 亚洲欧美久久久| 国产精品毛片久久久| 视频一区二区国产| 午夜精品成人av| 国产精品115| 在线国产精品一区| 91精品精品| 久久久精品国产**网站| 日韩1区2区3区| 日韩精品亚洲专区| 不卡福利视频| 日韩深夜视频| 中文字幕在线看片| 欧美三级网址| 亚洲午夜天堂| 偷拍精品精品一区二区三区| 日韩电影免费在线观看| 国产欧美一区二区三区精品酒店| 欧美国产偷国产精品三区| 精品美女视频 | 在线精品视频一区| 中文一区一区三区免费在线观 | 亚洲精品一级| 亚洲免费毛片| 91精品国产自产精品男人的天堂 | 日本欧美一区二区在线观看| 精品一区二区男人吃奶| 日本免费一区二区视频| 久久国产99| 国产在线成人| 成人羞羞在线观看网站| 久久超碰99| 国产日韩在线观看视频| 日韩在线观看一区二区三区| 久久aⅴ国产紧身牛仔裤| 欧美天堂亚洲电影院在线观看| 91一区二区| 久久久久九九精品影院| 欧美精品99| 国产精品一级在线观看| 国产欧美一区二区色老头| 日韩和欧美一区二区三区| 亚洲精品进入| 日本亚洲视频| 欧美一区不卡| 国产日韩一区| 欧美一级网址| 欧美一级二区| 国产色噜噜噜91在线精品| 欧美在线首页| 久久激情五月激情| 日韩不卡在线观看日韩不卡视频| 亚洲aa在线| 日韩av不卡在线观看| 精品日韩一区| 成人亚洲精品| 黄色免费成人| 日韩精品视频网站| 久久精品国产99国产| 国产一区二区色噜噜| 久久久精品五月天| 亚洲神马久久| 日韩在线网址| 国产精品久久久久久模特| 国产精品亚洲欧美一级在线| 国产欧美日韩一区二区三区在线| 欧美一区91| 久久久国产精品网站| 综合一区在线| 日韩在线一区二区| 久久wwww| 亚洲精华国产欧美| 国产高清亚洲| 最新日韩av| 久久久久黄色| 国产亚洲午夜| 国产精品片aa在线观看| 99久久视频| 91欧美极品| 99国产精品一区二区| 日韩专区视频网站| 日韩国产专区| 日本强好片久久久久久aaa| 中文另类视频| 18国产精品| 久久中文字幕av| 国产精品一区二区中文字幕| 激情综合在线| 久久av网址| 丝瓜av网站精品一区二区| 精品精品99| 美女国产精品| 韩国女主播一区二区三区| 国产精品女主播一区二区三区| 欧美91在线| 久久国产精品毛片| 91日韩在线| 欧美天堂一区二区| 亚洲精品国产偷自在线观看| 久久99性xxx老妇胖精品| 久久av在线| 少妇久久久久| 国产高清视频一区二区| 亚洲综合精品四区| 精品三级在线观看视频| 亚洲精品免费观看| 久久久久午夜电影| 欧美国产极品| 中文字幕av一区二区三区四区| 中文字幕高清在线播放| 欧美日韩午夜| 在线视频免费在线观看一区二区| 成人午夜在线| 欧美一区免费| 日韩专区一卡二卡| 久久久久国产精品一区三寸| 国产精品入口久久| 日韩一区二区三免费高清在线观看| 欧美日韩尤物久久| 捆绑调教美女网站视频一区 |