vue使用Vue.extend方法仿写个loading加载中效果实例

 更新时间:2022年06月14日 10:30:40   作者:水冗水孚  
在vue中提供v-loading命令,用于div的loading加载,下面这篇文章主要给大家介绍了关于vue使用Vue.extend方法仿写个loading加载中效果的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

需求描述

本文我们使用vue的extend方法实现一个全屏loading加载效果

  • 通过命令就可以让弹框开启或关闭,比如this.$showDialog()开启,this.$hideDialog()关闭
  • 方法可以传参更改loading中的文字
  • 也可以传参更改loading背景色

当然这里除了文字,背景色什么的,也可以传递更多的参数,具体可以根据业务场景设计,为了便于理解文章这里就不赘述了。

我们先看一下效果图:

效果图

代码实现

第一步,新建loading组件

比如我们在src目录下,新建loading文件夹用于存放loading相关文件,在这个文件夹下新建的loading.vue文件是用来做弹出框的组件

src/loading/loading.vue

<template>
  <!-- 打开弹框的动画 -->
  <transition name="animation">
    <div
      class="loadindWrap"
      v-if="showLoading"
      :style="{ background: backgroundColor }"
    >
      <div class="loadingContent">
        <div class="iBox">
          <i class="el-icon-loading"></i>
        </div>
        <div class="text">{{ text }}</div>
      </div>
    </div>
  </transition>
</template>

<script>
export default {
  data() {
    return {
      showLoading: false, // 控制显示与隐藏的标识
      backgroundColor: "rgba(0, 0, 0, 0.5)", // 默认背景色
      text: "加载中...", // 默认文字
    };
  },
};
</script>

<style lang="less" scoped>
.loadindWrap {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  .loadingContent {
    color: rgb(160, 233, 66);
    text-align: center;
    .iBox {
      margin-bottom: 6px;
      i {
        font-size: 20px;
        color: #bfa;
      }
    }
  }
}
// 加一个过渡效果
.animation-enter, .animation-leave-to { opacity: 0;}
.animation-enter-active, .animation-leave-active { transition: opacity 0.6s; }
</style>

第二步,新建index.js文件

比如我们在src目录下,新建的loading文件夹中再新建一个index.js文件用来书写相应js代码,用于控制loading弹框。

src/loading/index.js

// 引入vue
import Vue from 'vue'

// 引入loading组件
import dialog from './loading';

// 通过Vue的extend方法继承这个引入的dialog组件,继承后会返回一个vue子类,需要使用实例化即可
const Dialog = Vue.extend(dialog);

//创建实例并且挂载到一个div上
const app = new Dialog().$mount(document.createElement('div'))

// 打开弹框函数
function showDialog(options) {
    //初始化调用传递过来的参数赋值更改组件内内部值
    for (let key in options) {
        app[key] = options[key];
    }
    // 让其显示
    app.showLoading = true
    // 并将其插入body中
    document.body.appendChild(app.$el);
}

// 关闭弹框函数
function hideDialog() {
    // 因为是v-if去控制,所以将标识showLoading置为false,就会自动把弹框dom删掉
    app.showLoading = false
}

// 将打开函数和关闭函数都挂载到Vue原型上,方便我们调用
Vue.prototype.$showDialog = showDialog;
Vue.prototype.$hideDialog = hideDialog;

第三步,在main.js中引入之

main.js

// ...

// 最后要在main.js中引入,表示使用之,这样在任意组件中都可以执行对应方法了
import './loading/index.js'

new Vue({
  render: h => h(App),
  router,
  store // 挂载上去
}).$mount('#app')

第四步,命令式调用

<template>
  <div class="aBox">
    <el-button @click="show">点击出现加载中弹框</el-button>
  </div>
</template>

<script>
export default {
  methods: {
    // 通过指令的方式即可调用,很方便
    show() {
      this.$showDialog({
        text: "浏览器在加载中哇...",
      });
      // 模拟发请求,过了1.5秒钟再将其关闭
      setTimeout(() => {
        this.$hideDialog();
      }, 1500);
    },
  },
};
</script>

Vue.extend方法的理解

我们知道,无论哪种程序语言,或多或少都会有封装、继承、多态的思想,而Vue.extend方法就是Vue的一个用于继承组件的方法。官方是这样定义的:使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。

构造器也可以理解为是一个类,既然是一个类,就可以去实例化对象,extend方法可以实例一个组件对象,而这个组件对象拥有我们最初定义的loading.vue所有属性和方法。所以我们将这个组件对象挂载到一个div上,让其有一个着落,即成为dom元素。

最终,当我们需要弹框出现的时候,把这个dom元素插入到文档对象上,不需要的时候,再将其删除掉。这样就实现了,打开和关闭弹框的效果。

总结

到此这篇关于vue使用Vue.extend方法仿写个loading加载中效果实例的文章就介绍到这了,更多相关vue Vue.extend仿loading加载中内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue中uni-app 实现小程序登录注册功能

    vue中uni-app 实现小程序登录注册功能

    这篇文章主要介绍了uni-app 实现小程序登录注册功能,文中给大家介绍了实现思路,以及vuex和本地缓存的区别,需要的朋友可以参考下
    2019-10-10
  • UniApp在Vue3下使用setup语法糖创建和使用自定义组件的操作方法

    UniApp在Vue3下使用setup语法糖创建和使用自定义组件的操作方法

    通过defineProps定义属性,defineEmits定义事件,computed创建计算属性,emitEvent方法触发事件,在其他组件中导入并使用这些自定义组件,传递属性和监听事件,实现组件的复用性和可维护性,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • vue自定义指令实现v-tap插件

    vue自定义指令实现v-tap插件

    这篇文章主要为大家详细介绍了vue自定义指令实现v-tap插件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 通过实例解析chrome如何在mac环境中安装vue-devtools插件

    通过实例解析chrome如何在mac环境中安装vue-devtools插件

    这篇文章主要介绍了通过实例解析chrome如何在mac环境中安装vue-devtools插件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • elementUI el-radio 无法点击的问题解决

    elementUI el-radio 无法点击的问题解决

    本文主要介绍了elementUI el-radio 无法点击的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Vue中自定义日志打印插件问题

    Vue中自定义日志打印插件问题

    这篇文章主要介绍了Vue中自定义日志打印插件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • vue父组件向子组件动态传值的两种方法

    vue父组件向子组件动态传值的两种方法

    这篇文章主要介绍了vue父组件向子组件动态传值的两种方法 ,需要的朋友可以参考下
    2017-11-11
  • Vue-cli3项目引入Typescript的实现方法

    Vue-cli3项目引入Typescript的实现方法

    这篇文章主要介绍了Vue-cli3项目引入Typescript的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • vue3配置router路由并实现页面跳转功能

    vue3配置router路由并实现页面跳转功能

    这篇文章主要介绍了vue3配置router路由并实现页面跳转,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • vue终极性能优化方案(解决首页加载慢问题)

    vue终极性能优化方案(解决首页加载慢问题)

    最近在做项目中前端采用Vue技术,发现首页加载速度非常之慢,下面这篇文章主要给大家介绍了关于vue终极性能优化方案,主要解决首页加载慢问题,需要的朋友可以参考下
    2022-02-02

最新评论