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

下面是详细讲解“vue使用Vue.extend方法仿写个loading加载中效果实例”的完整攻略:

1. Vue.extend方法简介

Vue.extend是Vue.js中一个全局API,它接受一个参数对象并返回一个新的组件构造函数,这个构造函数可以被像任何其它组件一样被实例化。

其主要作用是定义可复用的组件模板,这些模板可以在后面使用到。

2. 实现过程

下面演示一个简单的使用Vue.extend方法实现一个加载中效果的例子。

2.1 使用场景

在实际开发中,我们经常需要用到一个loading效果,用来提示用户正在加载中,这个效果可以用异步请求、路由切换等场景下。

2.2 实现思路

我们先定义一个全局组件,通过Vue.extend方法将组件注册到全局,在需要使用的地方通过组件标签进行使用。

2.2.1 编写loading组件

我们先来编写一个loading组件,这个组件将作为我们的全局组件:

<!-- template代码,注意,这里是markdown格式,应该使用```包裹代码 -->
<template>
  <div class="loading">
    <div class="loading-icon"></div>
  </div>
</template>
// javascript代码
<script>
export default {
  name: 'loading',
  mounted() {
    this.$nextTick(() => {
      this.initLoading();
    });
  },
  methods: {
    initLoading() {
      const icon = this.$el.querySelector('.loading-icon');
      let rotate = 0;
      const timer = setInterval(() => {
        rotate += 180;
        icon.style.transform = `rotate(${rotate}deg)`;
      }, 200);
      this.timer = timer;
    }
  },
  beforeDestroy() {
    clearInterval(this.timer);
  }
}
</script>

<!-- CSS样式代码 -->
<style>
.loading {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0,0,0,0.2);
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
}

.loading-icon {
  border: 4px solid #eee;
  border-right-color: #333;
  height: 40px;
  width: 40px;
  border-radius: 50%;
  animation: rotate 2s infinite;
}

@keyframes rotate {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}
</style>

我们在模板中定义一个div,为其添加class为loading,并在其中再嵌套一个div,为其添加class为loading-icon,这个div将用来显示我们的loading效果。

组件逻辑比较简单,将loading-icon元素进行不断旋转,来显示加载中的效果。

2.2.2 注册loading组件

在全局中注册loading组件,我们在对应的vue文件中进行如下代码的编写:

import Vue from 'vue';
import Loading from './loading.vue';

const LoadingPlugin = Vue.extend(Loading);

LoadingPlugin.install = function(Vue) {
  Vue.prototype.$loading = function() {
    const instance = new LoadingPlugin().$mount();
    const appEl = document.querySelector('.app');
    appEl.appendChild(instance.$el);

    return instance;
  }
};

Vue.use(LoadingPlugin);

通过import引入loading的vue文件,然后通过Vue.extend方法来创建一个全局组件构造器,在这个构造函数中,我们先定义一个install方法,这个方法实现了在Vue.prototype上添加$loading方法的功能。

$loading方法作用为返回一个组件实例,并将其挂载到页面上。

我们将其挂载到父元素为.app的元素上,看下面的官网Dashboard的实现:

<template>
  <div class="app">
    <loading v-if="loading"></loading>
    ...
  </div>
</template>

<script>
...
methods: {
  fetchData() {
    this.loading = true;
    fetch('/api/data').then(response => {
      this.data = response.data;
      this.loading = false;
    });
  }
}
...
</script>

<style>
.app {
  ...
  position: relative;
}
</style>

可以看到,在app组件的模板中,我们添加了loading的组件标签,并传递了一个loading参数。

当loading参数为true时,加载中时我们就会看到一个loading效果。

到这里loading的实现就完成了。

3. 示例说明

下面通过两个示例来演示如何使用Vue.extend方法实现一个加载中效果的实例。

3.1 示例一

在Vue的create生命周期钩子中,添加isLoading和loadingText两个data:

<template>
  <div>
    <loading v-if="isLoading"></loading>
    <div>{{ loadingText }}</div>
  </div>
</template>

<script>
...
data() {
  return {
    isLoading: false,
    loadingText: '正在加载中...'
  }
},
created() {
  this.isLoading = true;
  setTimeout(() => {
    this.isLoading = false;
  }, 2000);
}
...
</script>

这个示例中,我们在created生命周期钩子中开启loading效果,并在两秒后关闭loading效果。

3.2 示例二

在路由的beforeEach生命周期钩子中,添加isLoading data:

<template>
  <div>
    <loading v-if="isLoading"></loading>
    ...
  </div>
</template>

<script>
...
data() {
  return {
    isLoading: false
  }
},
beforeRouteEnter(to, from, next) {
  this.isLoading = true;
  setTimeout(() => {
    this.isLoading = false;
    next();
  }, 2000);
}
...
</script>

这个示例中,我们在beforeEach生命周期钩子中开启loading效果,并在两秒后关闭loading效果。

总结

在Vue的开发中,我们经常会用到loading效果,这个效果是提示用户正在进行某个操作的效果。

Vue提供了Vue.extend方法,可以快速创建一个组件构造器,并将其封装为全局组件,以便后续在使用中同样成功。

以上就是使用Vue.extend方法创建全局组件实现loading效果的攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue使用Vue.extend方法仿写个loading加载中效果实例 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • el-form中的rules未生效的解决方法

    当在使用element-ui的el-form组件中配置rules进行表单验证时,有时会遇到rules未生效的问题。下面我们将介绍几种解决方法。 方法一:手动触发验证 当我们使用el-form组件配合rules进行表单校验时,需要在提交表单时调用validate方法触发表单校验。但有时由于各种原因,validate方法失效,可尝试手动触发验证。 <tem…

    Vue 2023年5月27日
    00
  • Vue中用JSON实现刷新界面不影响倒计时

    使用Vue实现倒计时是常见的需求,但是当页面进行刷新时,原有的倒计时会被重新开始,经常导致用户的混乱和不满。为了解决这个问题,我们可以使用JSON对象存储倒计时的剩余时长,在页面刷新时从JSON对象中读取信息,从而实现刷新界面不影响倒计时的效果。 具体实现步骤如下: 1. 利用Vue的生命周期函数 在Vue中,有一些生命周期函数可以用来监听组件的状态变化,我…

    Vue 2023年5月28日
    00
  • 微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)

    微信小程序MUI侧滑导航菜单示例 微信小程序中,实现侧滑导航菜单是一个常见的需求。常见的导航菜单可以分为三种:弹出式(Popup)、覆盖式(Overlay)和抽屉式(Drawer)。对于简单的需求,我们可以使用MUI框架中提供的侧滑组件来实现。下面我们详细介绍如何使用MUI实现弹出式的导航菜单。 使用MUI实现侧滑导航菜单 首先需要在小程序的app.json…

    Vue 2023年5月27日
    00
  • Vue 解决在element中使用$notify在提示信息中换行问题

    要在 element-ui 的 $notify 中进行换行,可以使用 html 标签进行内容换行。但是,直接在 $notify 中插入 html 标签会将其解析为字符串,而不是渲染成为 html 元素。因此许多人会通过使用 dangerouslyUseHTMLString 属性,来将 <br> 等 html 标签渲染为真正的 html 元素。 以…

    Vue 2023年5月27日
    00
  • vue之elementUi的el-select同时获取value和label的三种方式

    让我们来详细讲解一下“Vue之Element UI的el-select同时获取value和label的三种方式”的完整攻略。 介绍 在 Vue 中使用 Element UI 的 el-select 组件时,有时候我们需要同时获取到选中的 value 和 label 值,这时候就需要用到一些技巧来实现这个需求。在本文中,我将为大家介绍三种方式来同时获取 el-…

    Vue 2023年5月27日
    00
  • Vue3后台管理系统之创建和配置项目

    下面是对“Vue3后台管理系统之创建和配置项目”的完整攻略: 一、安装Node.js和Vue CLI 在官网https://nodejs.org/下载并安装最新版的Node.js。 打开终端或命令行,运行以下命令安装Vue CLI: npm install -g @vue/cli 验证Vue CLI是否安装成功,运行以下命令: vue –version 如…

    Vue 2023年5月28日
    00
  • 详解如何在Vue3使用<script lang=“ts“ setup>语法糖

    当我们使用Vue3时,可以使用<script lang=”ts” setup>语法糖来更方便地编写组件。下面我会详细讲解如何在Vue3中使用该语法糖。 准备工作 首先,我们需要安装Vue3以及TypeScript。可以使用以下命令来安装: npm install vue@next typescript 同时,我们需要在项目中添加以下编译器选项(t…

    Vue 2023年5月27日
    00
  • Vue指令的钩子函数使用方法

    Vue.js 是一种流行的前端框架,它带有大量的指令。指令允许 Vue 开发人员通过 HTML 绑定操作来扩展 HTML,使开发人员可以自定义指令,然后在 HTML 元素上应用它们。 Vue 中的每个指令都具有一组固定的生命周期钩子。 什么是 Vue 指令钩子函数 Vue 指令钩子函数是一组函数,它们在用户自定义指令的生命周期中被调用。它们提供了一个方法来控…

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