首页IT科技基于vue的音乐播放器(Vue3.0项目——打造企业级音乐App(二)图片懒加载、v-loading指令的开发和优化)

基于vue的音乐播放器(Vue3.0项目——打造企业级音乐App(二)图片懒加载、v-loading指令的开发和优化)

时间2025-05-01 22:29:22分类IT科技浏览3973
导读:系列文章目录 内容 参考链接 Vue3.0 项目启动 Vue3.0 项目启动(打造企业级音乐App) Vue3.0项目——打造企业级音乐App(一) Tab栏、轮播图、歌单列表、滚动组件...

系列文章目录

内容 参考链接 Vue3.0 项目启动 Vue3.0 项目启动(打造企业级音乐App) Vue3.0项目——打造企业级音乐App(一) Tab栏          、轮播图                 、歌单列表      、滚动组件 Vue3.0项目——打造企业级音乐App(二) 图片懒加载        、v-loading指令的开发和优化

项目演示

vue3.0-music

图片懒加载

main.js 文件

安装 vue3-lazy          ,在 main.js 文件中导入并使用 传入两个参数                 ,一个是 lazyPlugin      ,一个是要加载的图片的相对地址 import { createApp } from vue import App from ./App.vue import router from ./router import store from ./store import lazyPlugin from vue3-lazy // 引入全局样式文件 import @/assets/scss/index.scss createApp(App).use(store).use(router).use(lazyPlugin, { loading: require(@/assets/images/default.png) }).mount(#app)

recommend.vue 组件

修改 :src 为 v-lazy        ,实现图片的懒加载 <div class="icon"> <img width="60" height="60" v-lazy="item.pic"> </div>

效果图如下:

v-loading 自定义指令开发

./components/base/loading/loading.vue 组件

该组件定义加载中的图片和文字显示 <template> <div class="loading"> <div class="loading-content"> <img width="24" height="24" src="./loading.gif"> <p class="desc">{{title}}</p> </div> </div> </template> <script> export default { name: loading, data() { return { title: 正在载入... } }, methods: { setTitle(title) { this.title = title } } } </script> <style lang="scss" scoped>...</script>

./components/base/loading/directive.js 文件

该文件自定义 loading 指令 挂载更新的时候做出相应变化 仅适用于 absolute | fixed | relative 的定位(后面还会优化) // 自定义指令 loading import { createApp } from vue import Loading from ./loading const loadingDirective = { mounted(el, binding) { const app = createApp(Loading) const instance = app.mount(document.createElement(div)) el.instance = instance if (binding.value) { append(el) } }, // 更新的时候                ,loading 为 true         ,则还是执行 append(el)      ,为 false                ,执行 remove(el) updated (el, binding) { if (binding.value !== binding.oldValue) { binding.value ? append(el) : remove(el) } } } function append(el) { el.appendChild(el.instance.$el) } function remove(el) { el.removeChild(el.instance.$el) } export default loadingDirective

main.js 文件

导入并全局使用 loadingDirective import { createApp } from vue import App from ./App.vue import router from ./router import store from ./store import lazyPlugin from vue3-lazy import loadingDirective from ./components/base/loading/directive import @/assets/scss/index.scss createApp(App).use(store).use(router).use(lazyPlugin, { loading: require(@/assets/images/default.png) }).directive(loading, loadingDirective).mount(#app)

./views/recommend.vue 组件

v-loading 绑定加载中 <div class="recommend" v-loading="loading"> ... <h1 class="list-title" v-show="!loading">热门歌单推荐</h1> </div>

v-loading 自定义指令开发的优化

./components/base/loading/directive.js 文件

当没有设置 position 为 absolute | fixed | relative 其中一个时            ,自动添加 position: relative // 自定义指令 loading import { createApp } from vue import Loading from ./loading import { addClass, removeClass } from @/assets/js/dom // g-relative 是在 base.sass 中定义好的 position: relative const relativeCls = g-relative const loadingDirective = { mounted(el, binding) { const app = createApp(Loading) const instance = app.mount(document.createElement(div)) el.instance = instance // 拿到动态参数 const title = binding.arg if (typeof title !== undefined) { instance.setTitle(title) } if (binding.value) { append(el) } }, // 更新的时候   ,loading 为 true                ,则还是执行 append(el)               ,为 false,执行 remove(el) updated (el, binding) { const title = binding.arg if (typeof title !== undefined) { el.instance.setTitle(title) } if (binding.value !== binding.oldValue) { binding.value ? append(el) : remove(el) } } } function append(el) { // 获取元素当前样式 const style = getComputedStyle(el) // 如果样式不属于以下三种之一             ,则给 el 添加需要的定位 if ([absolute, fixed, relative].indexOf(style.position) === -1) { // 添加样式 addClass(el, relativeCls) } el.appendChild(el.instance.$el) } function remove(el) { removeClass(el, relativeCls) el.removeChild(el.instance.$el) } export default loadingDirective

./src/js/dom.js 文件

如果没有 absolute | fixed | relative                  ,则添加样式 binding.value 为 false 时   ,移出样式 export function addClass(el, className) { if (!el.classList.contains(className)) { el.classList.add(className) } } export function removeClass(el, className) { el.classList.remove(className) }

recommend.vue 组件

动态获取参数 <div class="recommend" v-loading:[loadingText]="loading"> ... </div> data() { return { loadingText: 正在载入... } }

至此          ,推荐页面的基本开发先告一段落                 ,接下来将进行歌手页面的开发

不积跬步无以至千里 不积小流无以成江海

点个关注不迷路      ,持续更新中…

声明:本站所有文章        ,如无特殊说明或标注                ,均为本站原创发布            。任何个人或组织         ,在未征得本站同意时      ,禁止复制                、盗用         、采集      、发布本站内容到任何网站                、书籍等各类媒体平台                。如若本站内容侵犯了原著者的合法权益                ,可联系我们进行处理     。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
数据中心机房解决方案(简述数据中心主机的管理方式) php通道(phpcms v9 phpsso 通信失败的解决办法)