vue 实现element-ui中的加载中状态

针对这个问题我将提供一份基本的思路和步骤。

思路

在 Element UI 中,它提供了一种自己的 loading 组件,用于展示加载状态。而它的实现方式是使用 Vue 在全局挂载了一个 $loading 对象,里面包含了一些属性、方法和事件。我们可以借鉴这个实现方式,来实现自己的加载中状态。

主要思路是:

  1. 在 Vue 的原型上定义一个名为 $loading 的对象

  2. $loading 对象中包含以下属性:

  3. show:用于标识是否展示加载状态

  4. text:用于展示加载状态时的提示文字

  5. background:用于展示加载状态时的背景颜色

  6. $loading 对象中包含以下方法:

  7. show:展示加载状态

  8. hide:隐藏加载状态

  9. 定义一个 Vue 全局的混入,用于在所有组件中访问 $loading 对象。

  10. 在需要展示加载状态的组件中,可以通过调用 $loading.show() 方法来展示加载状态,通过 $loading.hide() 方法来隐藏。

  11. 另外,还可以使用自定义指令等方式来快速实现加载状态。

实现步骤

下面是具体的实现步骤:

1. 定义 $loading 对象

Vue.prototype.$loading = {
  show(text = '加载中', background = 'rgba(0, 0, 0, 0.7)') {
    const div = document.createElement('div')
    div.innerHTML = `
      <div style="
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background-color: ${background};
        z-index: 9999; 
        display: flex;
        align-items: center;
        justify-content: center;
      ">
        <div style="
          position: relative;
          display: flex;
          align-items: center;
          justify-content: center;
        ">
          <i class="el-icon-loading" style="
            font-size: 30px;
            margin-right: 10px;
            color: #fff;
          "></i>
          <span style="
            color: #fff;
            font-size: 16px;
          ">${text}</span>
        </div>
      </div>
    `
    document.body.appendChild(div)
  },

  hide() {
    const loading = document.querySelector('.loading')
    if (loading) {
      document.body.removeChild(loading)
    }
  }
}

2. 定义全局混入

Vue.mixin({
  mounted() {
    this.$loading = Vue.prototype.$loading
  }
})

3. 在需要展示加载状态的组件中使用

<template>
  <div>
    ...
    <button @click="getData">获取数据</button>
    ...
  </div>
</template>

<script>
export default {
  methods: {
    async getData() {
      try {
        this.$loading.show('数据加载中...')
        const res = await fetchData()
        // do something with res
      } catch (err) {
        console.log(err)
      } finally {
        this.$loading.hide()
      }
    }
  }
}
</script>

4. 使用自定义指令

Vue.directive('loading', {
  inserted(el, binding) {
    const text = binding.value || '加载中'
    const div = document.createElement('div')
    div.className = 'loading'
    div.innerHTML = `
    <div style="
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.5);
      z-index: 999;
      display: flex;
      align-items: center;
      justify-content: center;
    ">
      <i class="el-icon-loading" style="
        font-size: 30px;
        margin-right: 10px;
        color: #fff;
      "></i>
      <span style="
        color: #fff;
        font-size: 16px;
      ">${text}</span>
    </div>
    `
    el.style.position = 'relative'
    el.appendChild(div)
  },

  update(el, binding) {
    if (binding.value) {
      el.querySelector('.loading').style.display = 'flex'
    } else {
      el.querySelector('.loading').style.display = 'none'
    }
  },

  unbind(el) {
    const loading = el.querySelector('.loading')
    if (loading) {
      el.removeChild(loading)
    }
  }
})

使用自定义指令实现的效果如下:

<template>
  <div v-loading="loading">
    ...
    <button @click="getData">获取数据</button>
    ...
  </div>
</template>

<script>
export default {
  data() {
    return {
      loading: false
    }
  },
  methods: {
    async getData() {
      try {
        this.loading = true
        const res = await fetchData()
        // do something with res
      } catch (err) {
        console.log(err)
      } finally {
        this.loading = false
      }
    }
  }
}
</script>

这样,在组件中使用 v-loading 指令即可实现加载状态的展示和隐藏。

至此,这就是实现 Vue 中加载中状态的完整攻略了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue 实现element-ui中的加载中状态 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • VUE实现分布式医疗挂号系统预约挂号首页步骤详情

    针对这个问题,我会给出以下详细的解答: 1. 背景与需求 在实现分布式医疗挂号系统时,预约挂号首页是至关重要的一步。用户通过首页进行预约挂号,需要浏览医院信息、选择科室、医生以及挂号时间等。因此,预约挂号首页需要实现如下功能: 显示医院信息,包括医院名称、地址、电话等。 显示可挂号的科室信息,包括科室名称、医生信息等。 支持根据时间、科室、医生等条件进行挂号…

    other 2023年6月26日
    00
  • 电脑共享文件控制软件、文档共享管理系统、共享文件监控软件白皮书

    电脑共享文件控制软件攻略 概述 电脑共享文件控制软件是一种可以对多台电脑的文件进行实时控制和共享的工具。通过该软件,可以实现文件的远程管理,避免了由于人为操作失误而导致的数据丢失和泄漏等问题。 操作步骤 下载并安装电脑共享文件控制软件; 打开软件后,将需要共享的文件夹添加到共享列表中; 设置共享权限,如设置访问密码、限定下载权限等; 在其他电脑上下载并安装此…

    other 2023年6月25日
    00
  • iOS支付宝使用方法详解

    iOS支付宝使用方法详解 1. 下载安装支付宝APP 在App Store中搜索“支付宝”,下载安装最新版本的支付宝APP。 2. 注册或登录支付宝账号 使用手机号码进行注册,或者绑定已有的支付宝账号。如果已经有支付宝账号,可以直接登录即可。 3. 添加支付方式 在支付宝APP中,点击“我的”按钮,进入个人中心页面。在个人中心页面中,点击“支付管理” -&g…

    other 2023年6月26日
    00
  • JS实现重新加载当前页面或者父页面的几种方法

    下面我将为你详细讲解JS实现重新加载当前页面或者父页面的几种方法。 方法一:使用location.reload()方法 简介 location.reload()方法可以重新加载当前页面,强制从服务器重新加载页面,而不是从浏览器缓存中加载。 用法 location.reload(); 示例 <!DOCTYPE html> <html> …

    other 2023年6月25日
    00
  • GTX1080驱动装不上怎么办 GTX1080驱动装不上的原因分析及快速解决办法

    GTX1080驱动装不上的原因分析及快速解决办法攻略 原因分析 不兼容的操作系统版本:某些驱动程序可能只适用于特定的操作系统版本。如果您的操作系统版本与驱动程序不兼容,安装过程可能会失败。 旧版本驱动的残留:如果您之前安装过旧版本的驱动程序,并且没有完全卸载干净,那么新的驱动程序可能无法正确安装。 损坏的驱动程序文件:下载的驱动程序文件可能已损坏,导致安装失…

    other 2023年8月3日
    00
  • 苹果推送watchOS3/macOS/tvOS10 beta2开发者预览版固件更新

    苹果公司在推出新版本的操作系统时,通常会先推出开发者预览版固件,供开发人员先行体验并测试自己的应用是否适配。本文将详细讲解苹果推送watchOS3/macOS/tvOS10 beta2开发者预览版固件更新的完整攻略。 步骤一:申请并下载 Developer Preview 首先,你需要申请 iOS Developer Program 的会员,如果已经是会员则…

    other 2023年6月26日
    00
  • Android蓝牙开发深入解析

    Android蓝牙开发深入解析 本篇文章旨在为读者提供与Android蓝牙开发相关的深入解析。文章包括了如下内容: 蓝牙基础知识 蓝牙开发流程 实现蓝牙连接 数据传输 示例说明 蓝牙基础知识 蓝牙协议栈 Android蓝牙协议栈分为两个层次: Bluetooth Manager Service层:该层提供了上层应用程序与底层硬件之间的接口,使用Bluetoo…

    other 2023年6月27日
    00
  • androidframelayout详解

    以下是关于“Android FrameLayout详解”的完整攻略,包括FrameLayout的介绍、示例说明等。 FrameLayout介绍 FrameLayout是Android中常用的布局容器之一,它可以用来放置一个或多个子视图,并且子视图可以重叠。FrameLayout的特点是可以在一位置放置多个子视图,但是只有一个子视图是可见的。 示例说明 以下是…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部