ElementPlus Loading 加載

2021-09-26 16:28 更新

Loading 加載

加載數(shù)據(jù)時(shí)顯示動(dòng)效。

區(qū)域加載

在表格等容器中加載數(shù)據(jù)時(shí)顯示。


Element Plus 提供了兩種調(diào)用 Loading 的方法:指令和服務(wù)。對(duì)于自定義指令v-loading,只需要綁定Boolean即可。默認(rèn)狀況下,Loading 遮罩會(huì)插入到綁定元素的子節(jié)點(diǎn),通過(guò)添加body修飾符,可以使遮罩插入至 DOM 中的 body 上。

<template>
  <el-table v-loading="loading" :data="tableData" style="width: 100%">
    <el-table-column prop="date" label="日期" width="180"> </el-table-column>
    <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
    <el-table-column prop="address" label="地址"> </el-table-column>
  </el-table>
</template>

<script>
  export default {
    data() {
      return {
        tableData: [
          {
            date: '2016-05-03',
            name: '王小虎',
            address: '上海市普陀區(qū)金沙江路 1518 弄',
          },
          {
            date: '2016-05-02',
            name: '王小虎',
            address: '上海市普陀區(qū)金沙江路 1518 弄',
          },
          {
            date: '2016-05-04',
            name: '王小虎',
            address: '上海市普陀區(qū)金沙江路 1518 弄',
          },
        ],
        loading: true,
      }
    },
  }
</script>
<style>
  body {
    margin: 0;
  }
</style>

自定義

可自定義加載文案、圖標(biāo)和背景色。


在綁定了v-loading指令的元素上添加?element-loading-text?屬性,其值會(huì)被渲染為加載文案,并顯示在加載圖標(biāo)的下方。類似地,?element-loading-spinner?、?element-loading-background?和?element-loading-svg?屬性分別用來(lái)設(shè)定圖標(biāo)類名、背景色值、加載圖標(biāo)。

<template>
  <el-table
    v-loading="loading"
    element-loading-text="拼命加載中"
    element-loading-spinner="el-icon-loading"
    element-loading-background="rgba(0, 0, 0, 0.8)"
    :data="tableData"
    style="width: 100%;margin-bottom: 10px"
  >
    <el-table-column prop="date" label="日期" width="180"> </el-table-column>
    <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
    <el-table-column prop="address" label="地址"> </el-table-column>
  </el-table>
  <el-table
    v-loading="loading"
    :element-loading-svg="svg"
    class="custom-loading-svg"
    element-loading-svg-view-box="-10, -10, 50, 50"
    :data="tableData"
    style="width: 100%"
  >
    <el-table-column prop="date" label="日期" width="180"> </el-table-column>
    <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
    <el-table-column prop="address" label="地址"> </el-table-column>
  </el-table>
</template>

<script>
  export default {
    data() {
      return {
        tableData: [
          {
            date: '2016-05-03',
            name: '王小虎',
            address: '上海市普陀區(qū)金沙江路 1518 弄',
          },
          {
            date: '2016-05-02',
            name: '王小虎',
            address: '上海市普陀區(qū)金沙江路 1518 弄',
          },
          {
            date: '2016-05-04',
            name: '王小虎',
            address: '上海市普陀區(qū)金沙江路 1518 弄',
          },
        ],
        loading: true,
        svg: `
          <path class="path" d="
            M 30 15
            L 28 17
            M 25.61 25.61
            A 15 15, 0, 0, 1, 15 30
            A 15 15, 0, 1, 1, 27.99 7.5
            L 15 15
          " style="stroke-width: 4px; fill: rgba(0, 0, 0, 0)"/>
        `,
      }
    },
  }
</script>
<style>
  .custom-loading-svg .el-loading-mask > .el-loading-spinner > .circular {
    animation: none;
  }
</style>

element-loading-svg 屬性雖然支持傳入 HTML 片段,但是在網(wǎng)站上動(dòng)態(tài)渲染任意 HTML 是非常危險(xiǎn)的,因?yàn)槿菀讓?dǎo)致 XSS 攻擊。請(qǐng)確保 element-loading-svg 的內(nèi)容是可信的,永遠(yuǎn)不要將用戶提交的內(nèi)容賦值給 element-loading-svg 屬性。

整頁(yè)加載

頁(yè)面數(shù)據(jù)加載時(shí)顯示。


當(dāng)使用指令方式時(shí),全屏遮罩需要添加fullscreen修飾符(遮罩會(huì)插入至 body 上),此時(shí)若需要鎖定屏幕的滾動(dòng),可以使用lock修飾符;當(dāng)使用服務(wù)方式時(shí),遮罩默認(rèn)即為全屏,無(wú)需額外設(shè)置。

<template>
  <el-button
    type="primary"
    @click="openFullScreen1"
    v-loading.fullscreen.lock="fullscreenLoading"
  >
    指令方式
  </el-button>
  <el-button type="primary" @click="openFullScreen2"> 服務(wù)方式 </el-button>
</template>

<script>
  export default {
    data() {
      return {
        fullscreenLoading: false,
      }
    },
    methods: {
      openFullScreen1() {
        this.fullscreenLoading = true
        setTimeout(() => {
          this.fullscreenLoading = false
        }, 2000)
      },
      openFullScreen2() {
        const loading = this.$loading({
          lock: true,
          text: 'Loading',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.7)',
        })
        setTimeout(() => {
          loading.close()
        }, 2000)
      },
    },
  }
</script>

服務(wù)

Loading 還可以以服務(wù)的方式調(diào)用。引入 Loading 服務(wù):

import { ElLoading } from 'element-plus'
JS

在需要調(diào)用時(shí):

ElLoading.service(options)
JS

其中 options 參數(shù)為 Loading 的配置項(xiàng),具體見(jiàn)下表。LoadingService 會(huì)返回一個(gè) Loading 實(shí)例,可通過(guò)調(diào)用該實(shí)例的 close 方法來(lái)關(guān)閉它:

let loadingInstance = ElLoading.service(options)
this.$nextTick(() => {
  // 以服務(wù)的方式調(diào)用的 Loading 需要異步關(guān)閉
  loadingInstance.close()
})
JS

需要注意的是,以服務(wù)的方式調(diào)用的全屏 Loading 是單例的:若在前一個(gè)全屏 Loading 關(guān)閉前再次調(diào)用全屏 Loading,并不會(huì)創(chuàng)建一個(gè)新的 Loading 實(shí)例,而是返回現(xiàn)有全屏 Loading 的實(shí)例:

let loadingInstance1 = ElLoading.service({ fullscreen: true })
let loadingInstance2 = ElLoading.service({ fullscreen: true })
console.log(loadingInstance1 === loadingInstance2) // true
JS

此時(shí)調(diào)用它們中任意一個(gè)的 close 方法都能關(guān)閉這個(gè)全屏 Loading。

如果完整引入了 Element,那么 app.config.globalProperties 上會(huì)有一個(gè)全局方法 $loading,它的調(diào)用方式為:this.$loading(options),同樣會(huì)返回一個(gè) Loading 實(shí)例。

Options

參數(shù)說(shuō)明類型可選值默認(rèn)值
targetLoading 需要覆蓋的 DOM 節(jié)點(diǎn)。可傳入一個(gè) DOM 對(duì)象或字符串;若傳入字符串,則會(huì)將其作為參數(shù)傳入 document.querySelector以獲取到對(duì)應(yīng) DOM 節(jié)點(diǎn)object/stringdocument.body
body同 v-loading 指令中的 body 修飾符booleanfalse
fullscreen同 v-loading 指令中的 fullscreen 修飾符booleantrue
lock同 v-loading 指令中的 lock 修飾符booleanfalse
text顯示在加載圖標(biāo)下方的加載文案string
spinner自定義加載圖標(biāo)類名string
background遮罩背景色string
customClassLoading 的自定義類名string


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)