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. 协议。