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

目录
  • 需求描述
  • 效果图
  • 代码实现
    • 第一步,新建loading组件
    • 第二步,新建index.js文件
    • 第三步,在main.js中引入之
    • 第四步,命令式调用
  • Vue.extend方法的理解
  • 总结

需求描述

本文我们使用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加载中内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题

    用过vue-router都知道它可以实现模块js的懒加载,即只有当需要时才去加载对应模块的js脚本文件,以加速主页的显示.比如只有第一次用户点击某个"用户信息"按钮或菜单时,才下载"用户信息"这个模块的js组件. 懒加载的实现,依赖与webpack下AMD模式require函数的功能.webpack会将异步require的文件生成一个独立的js文件,调用时异步下载这个js且在完成后再执行它.开发项目中实现的关键代码是: const basicInfo = { pat

  • vue实现ajax滚动下拉加载,同时具有loading效果(推荐)

    代码如下所示: <!doctype html> <html> <head> <meta charset="utf-8"> <title>vue测试ajax的使用</title> <meta id="viewport" name="viewport" content="width=device-width, initial-scale=1.0, minimum-

  • vue实现图片加载完成前的loading组件方法

    如下所示: <template> <img :src="url"> </template> <script> export default { props: ['src'], // 父组件传过来所需的url data() { return { url: 'http://www.86y.org/images/loading.gif' // 先加载loading.gif } }, mounted() { var newImg = new Im

  • vue 全局封装loading加载教程(全局监听)

    前言: 为了页面美观,请求接口的时候延迟没有数据,页面感觉狠卡顿,封装loading,请求接口成功后隐藏掉(我这是用的vant 组件根据自己情况进行改变). 第一步: 建立loading.vue <template> <div class="loading"> <van-loading size="36px" vertical>加载中...</van-loading> </div> </templat

  • vue+axios+element ui 实现全局loading加载示例

    实现全局loading加载 分析需求,我们只需要在请求发起的时候开始loading,响应结束的时候关闭loading,就这么简单 对不对? import axios from 'axios'; import { Message, Loading } from 'element-ui'; import Cookies from 'js-cookie'; import router from '@/router/index' let loading //定义loading变量 function st

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

    目录 需求描述 效果图 代码实现 第一步,新建loading组件 第二步,新建index.js文件 第三步,在main.js中引入之 第四步,命令式调用 Vue.extend方法的理解 总结 需求描述 本文我们使用vue的extend方法实现一个全屏loading加载效果 通过命令就可以让弹框开启或关闭,比如this.$showDialog()开启,this.$hideDialog()关闭 方法可以传参更改loading中的文字 也可以传参更改loading背景色 当然这里除了文字,背景色什么的

  • iOS仿抖音视频加载动画效果的实现方法

    前言 这几天一直跟开源的抖音demo斗智斗勇,今天跟大家分享的是抖音中或者快手中加载视频的动画,这个加载效果还是挺实用,下面话不多说了,来随着小编一起学习学习吧 上图看成品 实现原理 首先我创建一个视图 @interface ViewController () @property (nonatomic, strong) UIView *playLoadingView; @end @implementation ViewController - (void)viewDidLoad { [super

  • 模拟jQuery中的ready方法及实现按需加载css,js实例代码

    一.ready函数的实现经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的源码,涉及到的模块比较多,(水平有限)代码比较难看懂:自己结合了一些书籍内容,总结一下.先说一下ready函数的实现思路:变量ready通过表达式赋值,右侧为一个自执行匿名函数,在这个匿名函数中,首先为各个浏览器的事件绑定处理函数,并为isReady赋值(根据事件异步处理程序来确定),然后返回一个传参闭包,在闭包中,主要判断isReady值来执行操作,如果dom

  • vue 路由懒加载中给 Webpack Chunks 命名的方法

    最早的路由定义方式 import Vue from 'vue' import VueRouter from 'vue-router' import Home from '../views/Home.vue' import About from '../views/About.vue' import Login from '../views/Login.vue' Vue.use(VueRouter) const routes = [ { path: '/', name: 'Home', compo

  • vue 使用async写数字动态加载效果案例

    父组件 <interval-number :number-content="blockHeight" v-if="blockHeight>0"></interval-number> import IntervalNumber from './IntervalNumber.vue' components:{ IntervalNumber, } 子组件 <template> <span class="Interv

  • Vue加载中动画组件使用方法详解

    本文实例为大家分享了Vue加载中动画组件的使用,供大家参考,具体内容如下 (模仿ant-design加载中样式)效果图如下: ①创建Loading.vue组件: <template>   <div class="m-spin-dot">     <span class="u-dot-item"></span>     <span class="u-dot-item"></span&

  • vue插件mescroll.js实现移动端上拉加载和下拉刷新

    做一个简单的移动端展示项目,后台分页后前端加载,实现上拉加载下一页,找了下,还是用这个mescroll.js插件好一点 1.npm安装 npm install --save mescroll.js //不要使用cnpm安装 导入(在哪个页面使用,则在哪个页面导入(这里的话,我使用全局导入会出现问题,若有错,还请大家指出,暂时想到的就是局部引入)): import MescrollVue from 'mescroll.js/mescroll.vue' 注册组件: components: { Mes

  • vue之项目中如何封装loading加载效果

    目录 vue封装loading加载效果 Loading.vue loading.js main.js中导入并使用 项目中使用Loading加载 总结 vue封装loading加载效果 使用两个文件,vue文件是loading加载效果页面,JS文件用于main.js中use,供全局使用 Loading.vue <template> <div v-if="show" class="loading-container"> <div class

  • Vue.js上下滚动加载组件的实例代码

    由于工作的需要并鉴于网上的vue.js滚动加载方案不合适,自己写了一个简单实用的.就短短的150行代码. 组件代码 // scrollLoader.vue // 滚动加载组件 <style scoped> .container-main {margin: 0 auto; overflow: auto; overflow-x: hidden; padding: 0;} .loading{ width: 100%; height: 40px; position: relative; overflo

  • vue进行图片的预加载watch用法实例讲解

    watch应用场景 我想信图片预加载大家肯定都有接触过,当图片量大的时候,为了保证页面图片都加载出来的时候,我们才把主页面给显示出来,再进行一些ajax请求,或者逻辑操作 那此时你用computed对这种监听一个数据然后进行一系列逻辑操作和ajax请求,那watch再适合不过了,如果用computed的话那你连实现都实现不了,只有用watch监听 <template> <div v-show=show> <img src="https://img.alicdn.co

随机推荐