骨架装载器
v-skeleton-loader
组件是一种多功能工具,可以在项目中扮演许多角色。 从本质上讲,该组件向用户指示即将到来但尚不可用。 有 30 多个预定义选项可用,可以组合在一起以创建自定义示例。
用例
v-skeleton-loader
组件为用户提供了视觉指示,指示内容 即将到来/正在加载。 比传统的全屏加载器更好。
template script
<template>
<v-sheet
:color="`grey ${theme.isDark ? 'darken-2' : 'lighten-4'}`"
class="px-3 pt-3 pb-3"
>
<v-skeleton-loader
class="mx-auto"
max-width="300"
type="card"
></v-skeleton-loader>
</v-sheet>
</template>
<script>
export default {
// Vuetify components provide
// a theme variable that is
// used to determine dark
inject: ['theme'],
}
</script>
API
从下面选择您想要的组件,并查看可用的属性、插槽、事件和函数。
实战场
template script
<template>
<v-sheet
:color="`grey ${theme.isDark ? 'darken-2' : 'lighten-4'}`"
class="px-3 pt-3 pb-12"
>
<v-responsive
:max-width="type.indexOf('table') > -1 ? 900 : 500"
class="mx-auto"
>
<v-responsive
class="mx-auto mb-12"
max-width="500"
>
<div class="d-flex pa-3 align-center flex-wrap">
<v-select
v-model="type"
:items="types"
class="mr-12"
hide-details
label="Pre-made Types"
filled
style="max-width: 250px;"
></v-select>
<div>
<v-switch
v-model="boilerplate"
inset
hide-details
label="Boilerplate"
></v-switch>
<v-switch
v-model="tile"
inset
hide-details
label="Tile"
></v-switch>
</div>
</div>
</v-responsive>
<v-skeleton-loader
ref="skeleton"
:boilerplate="boilerplate"
:type="type"
:tile="tile"
class="mx-auto"
></v-skeleton-loader>
</v-responsive>
</v-sheet>
</template>
<script>
export default {
// Vuetify components provide
// a theme variable that is
// used to determine dark
inject: ['theme'],
data: () => ({
boilerplate: false,
tile: false,
type: 'list-item-avatar-three-line',
types: [],
}),
mounted () {
this.types = Object.keys(this.$refs.skeleton.rootTypes)
},
}
</script>
示例
下面是一些简单到复杂的例子。
样板组件
v-skeleton-loader
可以在创建模型时使用样板设计。 混合并匹配各种预定义选项,或创建自己的独特实现。 在此示例中,我们将 v-skeleton-loader
扩展到名为 v-boilerplate
的新组件中,以用作功能样板组件。
template script
<template>
<v-sheet
:color="`grey ${theme.isDark ? 'darken-2' : 'lighten-4'}`"
class="px-3 pt-3 pb-12"
>
<v-container>
<v-row>
<v-col
cols="12"
md="4"
>
<v-boilerplate
class="mb-6"
type="card-avatar, article, actions"
></v-boilerplate>
<v-boilerplate type="date-picker"></v-boilerplate>
</v-col>
<v-col
cols="12"
md="4"
>
<v-boilerplate
class="mb-6"
type="article, actions"
></v-boilerplate>
<v-boilerplate
class="mb-6"
type="table-heading, list-item-two-line, image, table-tfoot"
></v-boilerplate>
</v-col>
<v-col
cols="12"
md="4"
>
<v-boilerplate
class="mb-6"
type="list-item-avatar, divider, list-item-three-line, card-heading, image, actions"
></v-boilerplate>
<v-boilerplate type="list-item-avatar-three-line, image, article"></v-boilerplate>
</v-col>
</v-row>
</v-container>
</v-sheet>
</template>
<script>
export default {
// Vuetify components provide
// a theme variable that is
// used to determine dark
inject: ['theme'],
components: {
// Create a new component that
// extends v-skeleton-loader
VBoilerplate: {
functional: true,
render (h, { data, props, children }) {
return h('v-skeleton-loader', {
...data,
props: {
boilerplate: true,
elevation: 2,
...props,
},
}, children)
},
},
},
}
</script>
实现方法
有两种方法可以使用 v-skeleton-component
。default slot 或 v-if 条件。内建的插槽是最方便和最容易使用的,但是一旦渲染就会生成一个额外的 div。如果额外的 div 在您的设置中是一个问题,您可以使用一个 Vuetify transition component 或一个定制的 v-if 条件。
template script
<template>
<v-container class="grey">
<div class="text-center d-flex justify-center align-center mb-12 flex-wrap">
<v-btn
class="mx-12 my-4"
@click="loading = !loading"
>
Toggle
</v-btn>
<v-select
v-model="transition"
label="Transition"
hide-details
:items="transitions"
style="max-width: 200px;"
></v-select>
</div>
<v-row justify="center">
<v-col
class="text-center"
cols="12"
>
<div class="headline">Default Slot</div>
</v-col>
<v-col
class="mb-12"
cols="12"
md="4"
>
<v-skeleton-loader
:loading="loading"
:transition="transition"
height="94"
type="list-item-two-line"
>
<v-card>
<v-card-title>Title</v-card-title>
<v-card-text>Card Text</v-card-text>
</v-card>
</v-skeleton-loader>
</v-col>
<v-col
class="text-center"
cols="12"
>
<div class="headline">
If conditional<br>w/Transition Element
</div>
</v-col>
<v-col
cols="12"
md="4"
>
<component
:is="transition !== 'None' ? `v-${transition}` : 'div'"
hide-on-leave
>
<v-skeleton-loader
v-if="loading"
height="94"
type="list-item-two-line"
>
</v-skeleton-loader>
<v-card
v-else
>
<v-card-title>Title</v-card-title>
<v-card-text>Card Text</v-card-text>
</v-card>
</component>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
data: () => ({
loading: true,
transition: 'scale-transition',
transitions: [
{
text: 'None',
value: undefined,
},
{
text: 'Fade Transition',
value: 'fade-transition',
},
{
text: 'Scale Transition',
value: 'scale-transition',
},
],
}),
}
</script>
无障碍
默认情况下,v-skeleton-loader
组件被分配给了 WAI-ARIA 角色 alert。我们用两个法属性来补充这个角色。aria-busy 的值 true 表示小部件缺少所需属元素。aria-live 的值polite 设置屏幕读者对实时区域的优先级。