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

yizhihongxing

下面是详细讲解“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日

相关文章

  • 在vue-cli3中使用axios获取本地json操作

    在Vue CLI 3中使用axios获取本地JSON的操作步骤如下: 1. 安装依赖 在项目根目录下,使用以下命令安装axios和Vue CLI 3自带的webpack-dev-server: npm install axios npm install webpack-dev-server 2. 创建本地JSON文件 在项目的public文件夹下创建一个js…

    Vue 2023年5月28日
    00
  • Vue filter 过滤当前时间 实现实时更新效果

    Vue中可以通过过滤器(Filter)来对模板中的数据进行格式化处理。本文将介绍如何使用Vue filter来过滤当前时间,并实现实时更新效果的方法。 添加全局过滤器 首先我们需要在Vue实例中添加全局过滤器。在Vue中,可以通过 Vue.filter() 方法来添加全局过滤器。下面是一个简单的例子,这个过滤器会将传入的字符串全部转换为大写: Vue.fil…

    Vue 2023年5月29日
    00
  • vue3中各种类型文件进行预览功能实例

    我将为您详细讲解“Vue3中各种类型文件进行预览功能实例”的攻略。 一、问题背景 在Vue3中,如何实现对各种类型文件进行预览功能?比如图片、音频、视频等类型的文件。 二、解决方案 Vue3中可以使用第三方库来实现文件预览功能,其中比较常用的有以下几种: viewerjs:适用于图片、PDF、音频和视频等各种类型的文件预览。 vue-plyr:一个视频和音频…

    Vue 2023年5月28日
    00
  • Vue 重置data的数据为初始状态操作

    重置Vue组件的data数据为初始状态操作,通常涉及到将组件内部的data数据重置为初始值。这在实际开发中十分有用,比如表单重置、页面切换等操作。本文将介绍三种重置Vue组件data数据的方法。 方法一:直接定义一个初始data对象 我们可以定义一个初始的data对象,并使用Object.assign()方法将其复制给data对象。 <template…

    Vue 2023年5月28日
    00
  • vue使用vite配置跨域以及环境配置详解

    Vue使用Vite配置跨域以及环境配置详解 在Vue应用中,我们经常会遇到需要跨域请求接口的场景。同时,在不同的环境中,还需要配置不同的API地址。为了解决这些问题,我们可以使用Vite构建工具,并通过Vite提供的配置来实现跨域和环境配置。 跨域配置 在Vite中,我们可以通过proxy来实现跨域请求。首先,在项目根目录下创建vite.config.js文…

    Vue 2023年5月28日
    00
  • 利用webstrom调试Vue.js单页面程序的方法教程

    下面我将为你讲解“利用WebStorm调试Vue.js单页面程序的方法教程”。 环境准备 首先,需要你已经安装了WebStorm,以及Node.js和Vue CLI。 创建Vue.js单页面应用程序 打开WebStorm并创建一个新项目; 在终端中输入以下命令,使用Vue CLI创建一个Vue.js单页面应用程序: vue create myapp 在创建过…

    Vue 2023年5月27日
    00
  • GraphQL在react中的应用示例详解

    下面我将为您详细讲解“GraphQL在react中的应用示例详解”的完整攻略。 一、什么是GraphQL? GraphQL是由Facebook于2012年开发的一个用于API开发的查询语言,它使得客户端能够准确地获取所需的数据,而不需要从服务器请求额外的数据,从而提高了应用程序的效率。 二、GraphQL在React中的应用 1. 使用Apollo Clie…

    Vue 2023年5月28日
    00
  • Vue应用部署到服务器的正确方式

    Vue.js是一款功能强大但体积较小的前端框架,随着越来越多的Web应用程序采用Vue.js开发,部署Vue应用到服务器也变得越来越重要。以下是Vue应用部署到服务器的正确方式的详细攻略: 准备工作 首先,你需要确保你具备以下准备工作: Node.js环境:Vue.js需要Node.js来运行,因此请先安装Node.js。安装方式可以到Node.js官网上查…

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