vue3——自己封装骨架屏

·  阅读 653
vue3——自己封装骨架屏

前言

有很多时候,我们在浏览网页的时候,因为网络原因,没有办法第一时间看到网页里面的内容,那么骨架屏可以对网页有一个大致的展示。也可以很友好的让用户感知网页正在加载中,一起来看看如何实现骨架屏效果吧


一、为什么需要骨架屏?

  • 当用户刚打开网页的时候,后台还没有返回数据,页面没有办法渲染。
  • 如果用户正好网络状态不是很好,如果页面什么都不显示的话,用户极有可能直接选择退出了。
  • 骨架屏可以起到一个占位的作用,用户看到后就能知道此处有内容正在加载。

二、如何封装?

通过插件的方式,注册为全局组件。

类似elementUIvant等组件库中,都有骨架屏的效果展示,不太理解的小伙伴儿可以去看看。 element官网:骨架屏(PC端) vant官网:骨架屏(移动设备)

1. 准备组件

src/components文件夹下新建skeleton.vue文件 代码如下(示例):

<template>
  <div class="skeleton" :style="{width,height}" :class="{shan:animated}">
    <!-- 1 盒子-->
    <div class="block" :style="{backgroundColor:bg}"></div>
    <!-- 2 闪烁效果 skeleton 伪元素 --->
  </div>
</template>
<script>
export default {
  name: 'Skeleton',
  // 使用的时候需要动态设置 高度,宽度,背景颜色,是否闪烁
  props: {
    bg: {
      type: String,
      default: '#efefef'
    },
    width: {
      type: String,
      default: '100px'
    },
    height: {
      type: String,
      default: '100px'
    },
    animated: {
      type: Boolean,
      default: false
    }
  }
}
</script>
<style scoped lang="less">
.skeleton {
  display: inline-block;
  position: relative;
  overflow: hidden;
  vertical-align: middle;
  .block {
    width: 100%;
    height: 100%;
    border-radius: 2px;
  }
}
.shan {
  &::after {
    content: "";
    position: absolute;
    animation: shan 1.5s ease 0s infinite;
    top: 0;
    width: 50%;
    height: 100%;
    background: linear-gradient(
      to left,
      rgba(255, 255, 255, 0) 0,
      rgba(255, 255, 255, 0.3) 50%,
      rgba(255, 255, 255, 0) 100%
    );
    transform: skewX(-45deg);
  }
}
@keyframes shan {
  0% {
    left: -100%;
  }
  100% {
    left: 120%;
  }
}
</style>

复制代码

2. 注册为组件

src/components下面新建index.js文件

代码如下(示例): 如果还有其他的全局组件或者函数,也可以在install函数中进行注册

import Skeleton from './library/skeleton'
// vue2.0插件写法要素:导出一个对象,有install函数,默认传入了Vue构造函数,Vue基础之上扩展
// vue3.0插件写法要素:导出一个对象,有install函数,默认传入了app应用实例,app基础之上扩展
export default {
  install (app) {
    app.component(Skeleton.name, Skeleton)
  }
}

复制代码

3. 注册为插件

main.js中注册为全局插件 代码如下(示例):

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

+import myUI from './components'

+createApp(App).use(store).use(router).use(myUI).mount('#app')

复制代码

三、 如何使用?

1. 使用演示

.vue结尾的文件中

代码如下(示例):

将组件需要的参数传入即可

<template>
	<skeleton width="50px" height="20px" animated bg="#999"/>
</template>

<script>
export default {
  name: 'App',
  setup() {
  
  }
}
</script>

复制代码

效果演示 在这里插入图片描述

2. 应用场景介绍

可以在需要用到的地方,循环生成。等后台数据返回后,将骨架屏组件替换掉即可。

掘金PC端效果

x9c6b-mpzva.gif


总结

呜呼~

分类:
前端
标签:
分类:
前端
标签: