电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

vue實現骨架屏的示例

瀏覽:12日期: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
相關文章:
主站蜘蛛池模板: 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 学生作文网_中小学生作文大全与写作指导 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 便携式XPDM露点仪-在线式防爆露点仪-增强型烟气分析仪-约克仪器 冰雕-冰雪世界-大型冰雕展制作公司-赛北冰雕官网 | 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 新中天检测有限公司青岛分公司-山东|菏泽|济南|潍坊|泰安防雷检测验收 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 小型数控车床-数控车床厂家-双头数控车床 | 低合金板|安阳低合金板|河南低合金板|高强度板|桥梁板_安阳润兴 北京租车牌|京牌指标租赁|小客车指标出租 | 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 智能终端_RTU_dcm_北斗星空自动化科技 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 开锐教育-学历提升-职称评定-职业资格培训-积分入户 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 一体式钢筋扫描仪-楼板测厚仪-裂缝检测仪-泰仕特(北京) | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 求是网 - 思想建党 理论强党 | 颗粒机,颗粒机组,木屑颗粒机-济南劲能机械有限公司 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 周易算网-八字测算网 - 周易算网-宝宝起名取名测名字周易八字测算网 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 搜木网 - 木业全产业链交易平台,免费搜货、低价买货! | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 重庆私家花园设计-别墅花园-庭院-景观设计-重庆彩木园林建设有限公司 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 |