Loading 加载

加载数据时显示动效。

区域加载

在需要的时候展示加载动画,防止页面失去响应提高用户体验(例如表格)。

Element Plus 提供了两种调用 Loading 的方法:指令和服务。 对于自定义指令 v-loading,只需要绑定 boolean 值即可。 默认状况下,Loading 遮罩会插入到绑定元素的子节点。 通过添加 body 修饰符,可以使遮罩插入至 Dom 中的 body 上。

Loading 加载 - 图1

  1. <template>
  2. <el-table v-loading="loading" :data="tableData" style="width: 100%">
  3. <el-table-column prop="date" label="Date" width="180" />
  4. <el-table-column prop="name" label="Name" width="180" />
  5. <el-table-column prop="address" label="Address" />
  6. </el-table>
  7. </template>
  8. <script lang="ts" setup>
  9. import { ref } from 'vue'
  10. const loading = ref(true)
  11. const tableData = [
  12. {
  13. date: '2016-05-02',
  14. name: 'John Smith',
  15. address: 'No.1518, Jinshajiang Road, Putuo District',
  16. },
  17. {
  18. date: '2016-05-04',
  19. name: 'John Smith',
  20. address: 'No.1518, Jinshajiang Road, Putuo District',
  21. },
  22. {
  23. date: '2016-05-01',
  24. name: 'John Smith',
  25. address: 'No.1518, Jinshajiang Road, Putuo District',
  26. },
  27. ]
  28. </script>
  29. <style>
  30. body {
  31. margin: 0;
  32. }
  33. .example-showcase .el-loading-mask {
  34. z-index: 9;
  35. }
  36. </style>

自定义加载中组件内容

你可以自定义加载中组件的文字,图标,以及背景颜色。

在绑定了v-loading指令的元素上添加element-loading-text属性,其值会被渲染为加载文案,并显示在加载图标的下方。 类似地,element-loading-spinnerelement-loading-backgroundelement-loading-svg 属性分别用来设定 svg 图标、背景色值、加载图标。

Loading 加载 - 图2

  1. <template>
  2. <el-table
  3. v-loading="loading"
  4. element-loading-text="Loading..."
  5. :element-loading-spinner="svg"
  6. element-loading-svg-view-box="-10, -10, 50, 50"
  7. element-loading-background="rgba(122, 122, 122, 0.8)"
  8. :data="tableData"
  9. style="width: 100%"
  10. >
  11. <el-table-column prop="date" label="Date" width="180" />
  12. <el-table-column prop="name" label="Name" width="180" />
  13. <el-table-column prop="address" label="Address" />
  14. </el-table>
  15. <el-table
  16. v-loading="loading"
  17. :element-loading-svg="svg"
  18. class="custom-loading-svg"
  19. element-loading-svg-view-box="-10, -10, 50, 50"
  20. :data="tableData"
  21. style="width: 100%"
  22. >
  23. <el-table-column prop="date" label="Date" width="180" />
  24. <el-table-column prop="name" label="Name" width="180" />
  25. <el-table-column prop="address" label="Address" />
  26. </el-table>
  27. </template>
  28. <script lang="ts" setup>
  29. import { ref } from 'vue'
  30. const loading = ref(true)
  31. const svg = `
  32. <path class="path" d="
  33. M 30 15
  34. L 28 17
  35. M 25.61 25.61
  36. A 15 15, 0, 0, 1, 15 30
  37. A 15 15, 0, 1, 1, 27.99 7.5
  38. L 15 15
  39. " style="stroke-width: 4px; fill: rgba(0, 0, 0, 0)"/>
  40. `
  41. const tableData = [
  42. {
  43. date: '2016-05-02',
  44. name: 'John Smith',
  45. address: 'No.1518, Jinshajiang Road, Putuo District',
  46. },
  47. {
  48. date: '2016-05-04',
  49. name: 'John Smith',
  50. address: 'No.1518, Jinshajiang Road, Putuo District',
  51. },
  52. {
  53. date: '2016-05-01',
  54. name: 'John Smith',
  55. address: 'No.1518, Jinshajiang Road, Putuo District',
  56. },
  57. ]
  58. </script>
  59. <style>
  60. .example-showcase .el-loading-mask {
  61. z-index: 9;
  62. }
  63. </style>

WARNING

虽然 element-loading-spinner / element-loading-svg 属性支持传入的 HTML 片段,但是动态在网站上渲染任意的 HTML 是非常危险的,因为很容易导致 XSS 攻击 Loading 加载 - 图3 。 请确保 element-loading-spinner / element-loading-svg的内容是可信的, 不要将用户提交的内容赋值给 element-loading-spinner / element-loading-svg 属性。

让加载组件铺满整个屏幕

加载数据时显示全屏动画。

当使用指令方式时,全屏遮罩需要添加fullscreen修饰符(遮罩会插入至 body 上) 此时若需要锁定屏幕的滚动,可以使用lock修饰符; 当使用服务方式时,遮罩默认即为全屏,无需额外设置。

Loading 加载 - 图4

  1. <template>
  2. <el-button
  3. v-loading.fullscreen.lock="fullscreenLoading"
  4. type="primary"
  5. @click="openFullScreen1"
  6. >
  7. As a directive
  8. </el-button>
  9. <el-button type="primary" @click="openFullScreen2"> As a service </el-button>
  10. </template>
  11. <script lang="ts" setup>
  12. import { ref } from 'vue'
  13. import { ElLoading } from 'element-plus'
  14. const fullscreenLoading = ref(false)
  15. const openFullScreen1 = () => {
  16. fullscreenLoading.value = true
  17. setTimeout(() => {
  18. fullscreenLoading.value = false
  19. }, 2000)
  20. }
  21. const openFullScreen2 = () => {
  22. const loading = ElLoading.service({
  23. lock: true,
  24. text: 'Loading',
  25. background: 'rgba(0, 0, 0, 0.7)',
  26. })
  27. setTimeout(() => {
  28. loading.close()
  29. }, 2000)
  30. }
  31. </script>

以服务的方式来调用

Loading 还可以以服务的方式调用。 你可以像这样引入 Loading 服务:

  1. import { ElLoading } from 'element-plus'

在你需要的时候通过下面的方式调用:

  1. ElLoading.service(options)

其中options参数为 Loading 的配置项,具体见下表。 LoadingService 会返回一个 Loading 实例,可通过调用该实例的 close 方法来关闭它:

  1. const loadingInstance = ElLoading.service(options)
  2. nextTick(() => {
  3. // Loading should be closed asynchronously
  4. loadingInstance.close()
  5. })

需要注意的是,以服务的方式调用的全屏 Loading 是单例的。 若在前一个全屏 Loading 关闭前再次调用全屏 Loading,并不会创建一个新的 Loading 实例,而是返回现有全屏 Loading 的实例:

  1. const loadingInstance1 = ElLoading.service({ fullscreen: true })
  2. const loadingInstance2 = ElLoading.service({ fullscreen: true })
  3. console.log(loadingInstance1 === loadingInstance2) // true

此时调用它们中任意一个的 close 方法都能关闭这个全屏 Loading。

如果完整引入了 Element Plus,那么 app.config.globalProperties 上会有一个全局方法$loading, 它的调用方式为:this.$loading(options),同样会返回一个 Loading 实例。

配置项

属性说明类型可选值默认值
targetLoading 需要覆盖的 DOM 节点。 可传入一个 DOM 对象或字符串; 若传入字符串,则会将其作为参数传入 document.querySelector以获取到对应 DOM 节点object/stringdocument.body
bodyv-loading 指令中的 body 修饰符booleanfalse
fullscreenv-loading 指令中的 fullscreen 修饰符booleantrue
lockv-loading 指令中的 lock 修饰符booleanfalse
text显示在加载图标下方的加载文案string
spinner自定义加载图标类名string
background遮罩背景色string
custom-classLoading 的自定义类名string

指令

名称说明类型
v-loading是否显示动画boolean
element-loading-text显示在加载图标下方的加载文案string
element-loading-spinner自定义加载图标string
element-loading-svg自定义加载图标 (与 element-loading-spinner 相同)string
element-loading-background背景遮罩的颜色string

源代码

组件 Loading 加载 - 图5 文档 Loading 加载 - 图6

贡献者

Loading 加载 - 图7 三咲智子

Loading 加载 - 图8 云游君

Loading 加载 - 图9 jeremywu

Loading 加载 - 图10 Aex

Loading 加载 - 图11 btea

Loading 加载 - 图12 qiang

Loading 加载 - 图13 Delyan Haralanov

Loading 加载 - 图14 DoubleBird

Loading 加载 - 图15 BigPengZai

Loading 加载 - 图16 weidehai

Loading 加载 - 图17 anguiao

Loading 加载 - 图18 Bios Sun

Loading 加载 - 图19 on the field of hope

Loading 加载 - 图20 Ryan2128

Loading 加载 - 图21 Hades-li

Loading 加载 - 图22 C.Y.Kun