1.1.0 • Published 1 year ago
vue-default-page v1.1.0
Vue-Default-Page
一个 Vue 3.0 自定义指令包插件,内置 v-loading,v-skeleton,v-skeleton-avatar,v-skeleton-list,v-error,v-empty 等缺省页指令,专注解决网络请求时等待、回显和报错等场景。
目录
安装
npm i vue-default-page快速上手
完整引入
// main.js
// 引入指令
import vueDefaultPage from 'vue-default-page';
import { createApp } from 'vue';
const app = createApp();
// 注册指令
app.use(vueDefaultPage);<!-- demo.vue -->
<div v-loading="true"></div>全局配置
// main.js
app.use(vueDefaultPage, {
  background: '#000',
  loading: {
    iconColor: '#fff',
    miniIconColor: '#fff',
    textColor: '#fff',
  },
});| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| zIndex | 指令的层叠顺序 | number / string | 100 | 
| background | 背景遮罩的颜色 | string | #fff | 
| loading | v-loading 指令配置 | boolean / VdpLoading | true | 
| skeleton | v-skeleton 指令配置 | boolean / VdpSkeleton | true | 
| skeletonAvatar | v-skeleton-avatar 指令配置 | boolean / VdpSkeletonAvatar | false | 
| skeletonList | v-skeleton-list 指令配置 | boolean / VdpSkeletonList | false | 
| error | v-error 指令配置 | boolean / VdpError | true | 
| empty | v-empty 指令配置 | boolean / VdpEmpty | true | 
按需引入
// main.js
// 引入指令
import { vdpLoading } from 'vue-default-page';
import { createApp } from 'vue';
const app = createApp();
// 注册指令
app.use(vdpLoading);按需引入全局配置
// main.js
app.use(vdpLoading, {
  background: '#000',
  iconColor: '#fff',
  miniIconColor: '#fff',
  textColor: '#fff',
});| 名称 | 说明 | 配置项类型 | 
|---|---|---|
| vdpLoading | v-loading 指令 | VdpLoading | 
| vdpSkeleton | v-skeleton 指令 | VdpSkeleton | 
| vdpSkeletonAvatar | v-skeleton-avatar 指令 | VdpSkeletonAvatar | 
| vdpSkeletonList | v-skeleton-list 指令 | VdpSkeletonList | 
| vdpError | v-error 指令 | VdpError | 
| vdpEmpty | v-empty 指令 | VdpEmpty | 
局部引入
<!-- demo.vue -->
<script setup lang="js">
  // 引入指令创建方法
  import { createVueDefaultPage } from 'vue-default-page';
  // 创建指令
  const vLoading = createVueDefaultPage('loading');
</script>
<template>
  <div v-loading="true"></div>
</template>局部引入配置
方法一:在指令创建方法中配置,具体配置与按需引入全局配置一致。
<!-- demo.vue -->
<script setup lang="js">
  // 创建指令
  const vLoading = createVueDefaultPage('loading', {
    background: '#000',
    iconColor: '#fff',
    miniIconColor: '#fff',
    textColor: '#fff',
  });
</script>
<template>
  <div v-loading="true"></div>
</template>方法二:在元素上添加属性配置。
<!-- demo.vue -->
<template>
  <div
    v-loading="true"
    vdp-background="#000"
    vdp-loading-icon-color="#fff"
    vdp-loading-mini-icon-color="#fff"
    vdp-loading-text-color="#fff"
  ></div>
</template>通用属性配置项,各指令属性配置项请前往下方具体章节查看。
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| vdp-z-index | 指令的层叠顺序 | string | 100 | 
| vdp-background | 背景遮罩的颜色 | string | #fff | 
进阶
<!-- demo.vue -->
<script setup lang="js">
  import { ref } from 'vue';
  // npm i vue-hooks-plus
  import { useRequest } from 'vue-hooks-plus';
  const data = ref([]);
  // 模拟首次请求失败,刷新重试请求成功
  let times = 0;
  const api = () =>
    new Promise((resolve, reject) => {
      setTimeout(() => {
        data.value = Array.from({ length: 10 }, (v, k) => k);
        times ? resolve('请求成功') : reject('请求失败');
        times++;
      }, 2000);
    });
  // https://inhiblabcore.github.io/docs/hooks/useRequest
  const { loading, error, refresh } = useRequest(api);
</script>
<template>
  <div v-loading="loading" v-error="[!!error, refresh]" v-empty="!data.length">
    <div v-for="i in data" :key="i">{{ i }}</div>
  </div>
</template>显示优先级
指令均为 true 时会按以下优先级显示。
v-loading > v-skeleton = v-skeleton-avatar = v-skeleton-list > v-error > v-empty
v-loading
可自定义图标,v-error 和 v-empty 中也有相同的配置项。
<!-- demo.vue -->
<script setup lang="js">
  import { createVueDefaultPage } from 'vue-default-page';
  const icon = `<svg class="circle" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160">
    <path
      d="M151.5,80A71.5,71.5,0,1,1,80,8.5"
      fill="none"
      stroke="#bbb"
      stroke-miterlimit="10"
      stroke-width="16"
    />
  </svg>`;
  // 创建指令
  const vLoading = createVueDefaultPage('loading', {
    icon,
    miniIcon: icon,
  });
</script>
<template>
  <div v-loading="true"></div>
</template>
<style>
  .circle {
    display: block;
    animation: spin 1.5s ease-in-out infinite;
  }
  @keyframes spin {
    100% {
      transform: rotate(360deg);
    }
  }
</style>VdpLoading 配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| enable | 是否使用指令(仅在全局配置时生效) | boolean | true | 
| text | 文案 | string | Loading… | 
| textColor | 文案颜色 | string | #999 | 
| iconColor | 图标颜色(自定义图标时失效) | string | #bbb | 
| miniIconColor | 小图标颜色(自定义小图标时失效) | string | #bbb | 
| icon | 自定义图标 | string | — | 
| miniIcon | 自定义小图标 | boolean / string | true | 
| iconMaxSize | 图标最大尺寸 | number / string | 24 | 
| iconShowText | 大图标时是否显示文案 | boolean | true | 
| zIndex | 指令的层叠顺序 | number / string | 100 | 
| background | 背景遮罩的颜色 | string | #fff | 
属性配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| vdp-loading-text | 文案 | string | Loading… | 
| vdp-loading-text-color | 文案颜色 | string | #999 | 
| vdp-loading-icon-color | 图标颜色(自定义图标时失效) | string | #bbb | 
| vdp-loading-mini-icon-color | 小图标颜色(自定义小图标时失效) | string | #bbb | 
| vdp-loading-icon | 自定义图标 | string | — | 
| vdp-loading-mini-icon | 自定义小图标 | string | — | 
| vdp-loading-icon-max-size | 图标最大尺寸 | string | 24 | 
v-skeleton
默认显示头像和列表 skeleton,也可以单独使用。
<!-- demo.vue -->
<template>
  <div v-skeleton="true"></div>
  <div v-skeleton.avatar="true"></div>
  <div v-skeleton.list="true"></div>
</template>VdpSkeleton 配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| enable | 是否使用指令(仅在全局配置时生效) | boolean | true | 
| animation | 动画 | boolean / ('avatar' | 'list')[] / Animation | true | 
| avatarMaxSize | 头像最大尺寸 | number / string | 54 | 
| zIndex | 指令的层叠顺序 | number / string | 100 | 
| background | 背景遮罩的颜色 | string | #fff | 
属性配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| vdp-skeleton-avatar-max-size | 头像最大尺寸 | string | 54 | 
Animation
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| avatar | 开启头像动画 | boolean | true | 
| list | 开启列表动画 | boolean | true | 
头像或列表 skeleton 也可以通过定义指令的形式单独使用,但与其他指令不同的是这两个指令默认是关闭的,需手动开启。
// main.js
app.use(vueDefaultPage, {
  skeletonAvatar: true,
  skeletonList: true,
});<!-- demo.vue -->
<template>
  <div v-skeleton-avatar="true"></div>
  <div v-skeleton-list="true"></div>
</template>VdpSkeletonAvatar 配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| enable | 是否使用指令(仅在全局配置时生效) | boolean | false | 
| animation | 动画 | boolean | true | 
| avatarMaxSize | 头像最大尺寸 | number / string | 54 | 
| zIndex | 指令的层叠顺序 | number / string | 100 | 
| background | 背景遮罩的颜色 | string | #fff | 
VdpSkeletonList 配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| enable | 是否使用指令(仅在全局配置时生效) | boolean | false | 
| animation | 动画 | boolean | true | 
| zIndex | 指令的层叠顺序 | number / string | 100 | 
| background | 背景遮罩的颜色 | string | #fff | 
v-error
和其他指令一样可以通过布尔值控制显示和隐藏。
<!-- demo.vue -->
<template>
  <div v-error="true"></div>
</template>也可以通过数组传入对应的刷新函数,具体使用可以查看进阶篇章。
<!-- demo.vue -->
<template>
  <div v-error="[error, () => {}]"></div>
</template>VdpError 配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| enable | 是否使用指令(仅在全局配置时生效) | boolean | true | 
| text | 文案 | string | Network Error | 
| refreshText | 刷新文案(传入刷新函数时生效) | boolean / string | , Click to Refresh | 
| textColor | 文案颜色 | string | #999 | 
| icon | 自定义图标 | string | — | 
| miniIcon | 自定义小图标 | boolean / string | true | 
| iconMaxSize | 图标最大尺寸 | number / string | 180 | 
| iconShowText | 大图标时是否显示文案 | boolean | true | 
| zIndex | 指令的层叠顺序 | number / string | 100 | 
| background | 背景遮罩的颜色 | string | #fff | 
属性配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| vdp-error-text | 文案 | string | Network Error | 
| vdp-error-refresh-text | 刷新文案(传入刷新函数时生效) | string | , Click to Refresh | 
| vdp-error-text-color | 文案颜色 | string | #999 | 
| vdp-error-icon | 自定义图标 | string | — | 
| vdp-error-mini-icon | 自定义小图标 | string | — | 
| vdp-error-icon-max-size | 图标最大尺寸 | string | 180 | 
v-empty
所有指令都会根据容器大小自动调整高度,并且有不同的显示状态。
<!-- demo.vue -->
<template>
  <div v-empty="true" style="height: 500px;"></div>
  <div v-empty="true"></div>
</template>可通过 iconMaxSize 配置项或 vdp-empty-icon-max-size 属性配置项更改图标最大尺寸(v-skeleton 系列指令只能通过 avatarMaxSize 配置项更改头像最大尺寸)。
<!-- demo.vue -->
<template>
  <div
    v-empty="true"
    style="height: 500px;"
    vdp-empty-icon-max-size="400"
  ></div>
</template>VdpEmpty 配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| enable | 是否使用指令(仅在全局配置时生效) | boolean | true | 
| text | 文案 | string | No Data | 
| textColor | 文案颜色 | string | #999 | 
| icon | 自定义图标 | string | — | 
| miniIcon | 自定义小图标 | boolean / string | false | 
| iconMaxSize | 图标最大尺寸 | number / string | 180 | 
| iconShowText | 大图标时是否显示文案 | boolean | true | 
| zIndex | 指令的层叠顺序 | number / string | 100 | 
| background | 背景遮罩的颜色 | string | #fff | 
属性配置项
| 名称 | 说明 | 类型 | 默认值 | 
|---|---|---|---|
| vdp-empty-text | 文案 | string | No Data | 
| vdp-empty-text-color | 文案颜色 | string | #999 | 
| vdp-empty-icon | 自定义图标 | string | — | 
| vdp-empty-mini-icon | 自定义小图标 | string | — | 
| vdp-empty-icon-max-size | 图标最大尺寸 | string | 180 | 
兼容移动端
Vue-Default-Page 默认使用 px 作为样式单位,设计稿宽度为 375,可以使用 postcss-px-to-viewport 等插件转换为 viewport 单位。
// vite.config.js
import pxToViewport from 'postcss-px-to-viewport';
export default defineConfig(() => {
  return {
    css: {
      postcss: {
        plugins: [pxToViewport({ viewportWidth: 375 })],
      },
    },
  };
});鸣谢
感谢 element-plus 提供灵感。
开源协议
本项目基于 MIT. 协议。