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日

相关文章

  • Vuejs从数组中删除元素的示例代码

    当我们在Vuejs中使用数组时,有时需要删除内部的元素。在本文中,我们将讨论如何使用Vuejs从数组中删除元素的示例代码。 示例1:使用Vuejs的原生方法splice删除元素 Vuejs中可以使用JavaScript原生方法splice()从数组中删除元素。 这个方法接受两个参数,一个是开始的索引,另一个是要删除的元素数量。 // 假设我们有一个数组如下:…

    Vue 2023年5月29日
    00
  • JS实现的点击表头排序功能示例

    下面是详细的攻略: 什么是点击表头排序功能? 点击表头排序是一种JavaScript编写的功能,在表格中点击表头时,可以按照表头所指向的列数据的大小为依据,对表格的行进行排序的功能。 代码实现 以下是一份实现点击表头排序功能的代码示例,其中使用jQuery库和ES6箭头函数: // 获取表格 var table = $(‘table.sortable’); …

    Vue 2023年5月28日
    00
  • vue3.0 项目搭建和使用流程

    Vue 3.0 项目搭建和使用流程 Vue 3.0 是一款非常流行的前端框架,它在性能和便捷性方面都有很大的优势。本文将详细介绍 Vue 3.0 项目搭建和使用流程。 安装 Vue CLI Vue CLI 是 Vue.js 官方提供的脚手架工具,使用起来非常方便。可以通过以下命令全局安装 Vue CLI: npm install -g @vue/cli 创建…

    Vue 2023年5月28日
    00
  • Vue3使用Vuex之mapState与mapGetters详解

    当使用Vue3构建大型Web应用时,状态管理是很重要的一点。Vuex是一个非常流行的Vue.js状态管理库。而在Vue3中,使用Vuex也是非常方便的。其中,使用mapState和mapGetters是非常常见的两种方式。下面,我们详细讲解一下这两种方式的使用方法。 mapState mapState是Vuex提供的辅助函数,可以将store中的state映…

    Vue 2023年5月27日
    00
  • vue实现将一个数组内的相同数据进行合并

    要将一个数组内的相同数据进行合并,可以使用Vue.js提供的计算属性来完成。首先,需要对原始数据进行处理,将相同的数据进行合并,然后在模板中使用计算属性来渲染数据。 下面是一些示例说明: 示例一:将相邻重复的数字合并成一个,输出 [1,2,3,4,5] <template> <div> <p v-for="num in…

    Vue 2023年5月28日
    00
  • 用Vue Demi同时支持Vue2和Vue3的方法

    使用Vue Demi同时支持Vue 2和Vue 3要点如下: 引入 Vue Demi 在使用 Vue 2 的项目中引入 Vue Demi 库,并与 Vue 进行关联,以支持 Vue 3 的生命周期和组合式 API。 import Vue from ‘vue’ import { createComponent, reactive, toRefs } from …

    Vue 2023年5月28日
    00
  • 玩转Koa之核心原理分析

    “玩转Koa之核心原理分析”是一篇讲解Koa框架核心原理的文章,下面是该攻略的完整讲解: 玩转Koa之核心原理分析 什么是Koa Koa是一个轻量级的Node.js web框架,由 Express 幕后的团队设计开发,同样基于中间件思想,以更优雅、简洁的语法和更强大的错误处理能力,让 Web 开发变得更加得简单、快速和可靠。 Koa的核心原理 Koa的核心原…

    Vue 2023年5月28日
    00
  • 手写vue无限滚动指令的详细过程

    关于手写Vue无限滚动指令的详细过程,我准备了以下攻略,希望对你有所帮助: 1. 确定需求 在开始手写Vue无限滚动指令之前,首先需要明确需求和具体功能。无限滚动指令可以将长列表数据分批次渲染显示,当用户滚动页面时,自动加载下一页数据,避免一次性加载全部内容。 2. 创建指令 接下来创建无限滚动指令,具体步骤如下: 2.1 注册指令 在Vue实例中,注册一个…

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