骨架装载器

v-skeleton-loader 组件是一种多功能工具,可以在项目中扮演许多角色。 从本质上讲,该组件向用户指示即将到来但尚不可用。 有 30 多个预定义选项可用,可以组合在一起以创建自定义示例。

用例

v-skeleton-loader 组件为用户提供了视觉指示,指示内容 即将到来/正在加载。 比传统的全屏加载器更好。

template script


  1. <template>
  2. <v-sheet
  3. :color="`grey ${theme.isDark ? 'darken-2' : 'lighten-4'}`"
  4. class="px-3 pt-3 pb-3"
  5. >
  6. <v-skeleton-loader
  7. class="mx-auto"
  8. max-width="300"
  9. type="card"
  10. ></v-skeleton-loader>
  11. </v-sheet>
  12. </template>
  1. <script>
  2. export default {
  3. // Vuetify components provide
  4. // a theme variable that is
  5. // used to determine dark
  6. inject: ['theme'],
  7. }
  8. </script>

Skeleton Loaders(骨架装载器) - 图1

API

从下面选择您想要的组件,并查看可用的属性、插槽、事件和函数。

Skeleton Loaders(骨架装载器) - 图2

实战场

template script


  1. <template>
  2. <v-sheet
  3. :color="`grey ${theme.isDark ? 'darken-2' : 'lighten-4'}`"
  4. class="px-3 pt-3 pb-12"
  5. >
  6. <v-responsive
  7. :max-width="type.indexOf('table') > -1 ? 900 : 500"
  8. class="mx-auto"
  9. >
  10. <v-responsive
  11. class="mx-auto mb-12"
  12. max-width="500"
  13. >
  14. <div class="d-flex pa-3 align-center flex-wrap">
  15. <v-select
  16. v-model="type"
  17. :items="types"
  18. class="mr-12"
  19. hide-details
  20. label="Pre-made Types"
  21. filled
  22. style="max-width: 250px;"
  23. ></v-select>
  24. <div>
  25. <v-switch
  26. v-model="boilerplate"
  27. inset
  28. hide-details
  29. label="Boilerplate"
  30. ></v-switch>
  31. <v-switch
  32. v-model="tile"
  33. inset
  34. hide-details
  35. label="Tile"
  36. ></v-switch>
  37. </div>
  38. </div>
  39. </v-responsive>
  40. <v-skeleton-loader
  41. ref="skeleton"
  42. :boilerplate="boilerplate"
  43. :type="type"
  44. :tile="tile"
  45. class="mx-auto"
  46. ></v-skeleton-loader>
  47. </v-responsive>
  48. </v-sheet>
  49. </template>
  1. <script>
  2. export default {
  3. // Vuetify components provide
  4. // a theme variable that is
  5. // used to determine dark
  6. inject: ['theme'],
  7. data: () => ({
  8. boilerplate: false,
  9. tile: false,
  10. type: 'list-item-avatar-three-line',
  11. types: [],
  12. }),
  13. mounted () {
  14. this.types = Object.keys(this.$refs.skeleton.rootTypes)
  15. },
  16. }
  17. </script>

Skeleton Loaders(骨架装载器) - 图3

示例

下面是一些简单到复杂的例子。

样板组件

v-skeleton-loader 可以在创建模型时使用样板设计。 混合并匹配各种预定义选项,或创建自己的独特实现。 在此示例中,我们将 v-skeleton-loader 扩展到名为 v-boilerplate 的新组件中,以用作功能样板组件。

template script


  1. <template>
  2. <v-sheet
  3. :color="`grey ${theme.isDark ? 'darken-2' : 'lighten-4'}`"
  4. class="px-3 pt-3 pb-12"
  5. >
  6. <v-container>
  7. <v-row>
  8. <v-col
  9. cols="12"
  10. md="4"
  11. >
  12. <v-boilerplate
  13. class="mb-6"
  14. type="card-avatar, article, actions"
  15. ></v-boilerplate>
  16. <v-boilerplate type="date-picker"></v-boilerplate>
  17. </v-col>
  18. <v-col
  19. cols="12"
  20. md="4"
  21. >
  22. <v-boilerplate
  23. class="mb-6"
  24. type="article, actions"
  25. ></v-boilerplate>
  26. <v-boilerplate
  27. class="mb-6"
  28. type="table-heading, list-item-two-line, image, table-tfoot"
  29. ></v-boilerplate>
  30. </v-col>
  31. <v-col
  32. cols="12"
  33. md="4"
  34. >
  35. <v-boilerplate
  36. class="mb-6"
  37. type="list-item-avatar, divider, list-item-three-line, card-heading, image, actions"
  38. ></v-boilerplate>
  39. <v-boilerplate type="list-item-avatar-three-line, image, article"></v-boilerplate>
  40. </v-col>
  41. </v-row>
  42. </v-container>
  43. </v-sheet>
  44. </template>
  1. <script>
  2. export default {
  3. // Vuetify components provide
  4. // a theme variable that is
  5. // used to determine dark
  6. inject: ['theme'],
  7. components: {
  8. // Create a new component that
  9. // extends v-skeleton-loader
  10. VBoilerplate: {
  11. functional: true,
  12. render (h, { data, props, children }) {
  13. return h('v-skeleton-loader', {
  14. ...data,
  15. props: {
  16. boilerplate: true,
  17. elevation: 2,
  18. ...props,
  19. },
  20. }, children)
  21. },
  22. },
  23. },
  24. }
  25. </script>

Skeleton Loaders(骨架装载器) - 图4

实现方法

有两种方法可以使用 v-skeleton-componentdefault slotv-if 条件。内建的插槽是最方便和最容易使用的,但是一旦渲染就会生成一个额外的 div。如果额外的 div 在您的设置中是一个问题,您可以使用一个 Vuetify transition component 或一个定制的 v-if 条件。

template script


  1. <template>
  2. <v-container class="grey">
  3. <div class="text-center d-flex justify-center align-center mb-12 flex-wrap">
  4. <v-btn
  5. class="mx-12 my-4"
  6. @click="loading = !loading"
  7. >
  8. Toggle
  9. </v-btn>
  10. <v-select
  11. v-model="transition"
  12. label="Transition"
  13. hide-details
  14. :items="transitions"
  15. style="max-width: 200px;"
  16. ></v-select>
  17. </div>
  18. <v-row justify="center">
  19. <v-col
  20. class="text-center"
  21. cols="12"
  22. >
  23. <div class="headline">Default Slot</div>
  24. </v-col>
  25. <v-col
  26. class="mb-12"
  27. cols="12"
  28. md="4"
  29. >
  30. <v-skeleton-loader
  31. :loading="loading"
  32. :transition="transition"
  33. height="94"
  34. type="list-item-two-line"
  35. >
  36. <v-card>
  37. <v-card-title>Title</v-card-title>
  38. <v-card-text>Card Text</v-card-text>
  39. </v-card>
  40. </v-skeleton-loader>
  41. </v-col>
  42. <v-col
  43. class="text-center"
  44. cols="12"
  45. >
  46. <div class="headline">
  47. If conditional<br>w/Transition Element
  48. </div>
  49. </v-col>
  50. <v-col
  51. cols="12"
  52. md="4"
  53. >
  54. <component
  55. :is="transition !== 'None' ? `v-${transition}` : 'div'"
  56. hide-on-leave
  57. >
  58. <v-skeleton-loader
  59. v-if="loading"
  60. height="94"
  61. type="list-item-two-line"
  62. >
  63. </v-skeleton-loader>
  64. <v-card
  65. v-else
  66. >
  67. <v-card-title>Title</v-card-title>
  68. <v-card-text>Card Text</v-card-text>
  69. </v-card>
  70. </component>
  71. </v-col>
  72. </v-row>
  73. </v-container>
  74. </template>
  1. <script>
  2. export default {
  3. data: () => ({
  4. loading: true,
  5. transition: 'scale-transition',
  6. transitions: [
  7. {
  8. text: 'None',
  9. value: undefined,
  10. },
  11. {
  12. text: 'Fade Transition',
  13. value: 'fade-transition',
  14. },
  15. {
  16. text: 'Scale Transition',
  17. value: 'scale-transition',
  18. },
  19. ],
  20. }),
  21. }
  22. </script>

Skeleton Loaders(骨架装载器) - 图5

无障碍

默认情况下,v-skeleton-loader 组件被分配给了 WAI-ARIA 角色 alert。我们用两个法属性来补充这个角色。aria-busy 的值 true 表示小部件缺少所需属元素。aria-live 的值polite 设置屏幕读者对实时区域的优先级。