vue实现公共方法抽离

yizhihongxing

下面是“Vue实现公共方法抽离”的完整攻略,其中包含两个示例。

1. 需求背景

在Vue项目中,有一些公共方法会被多个组件共用,为了避免代码冗余,我们需要将这些公共方法抽离出来,然后挂载到Vue的prototype上,以便全局调用。

2. 具体实现步骤

2.1 抽离公共方法

将多个组件中共用的方法,抽离出来,建议以模块化的方式管理。下面是一个示例,假设我们将/utils目录下的common.js文件中的公共方法抽离出来:

// /utils/common.js

export function formatDate(date) {
  // ... 格式化日期的代码
}

export function showLoading(msg) {
  // ... 显示loading的代码
}

export function hideLoading() {
  // ... 隐藏loading的代码
}

2.2 挂载到Vue原型链上

将抽离出来的公共方法,挂载到Vue的prototype上,这样所有组件都可以通过this访问这些方法。下面是一个示例:

import Vue from 'vue'
import { formatDate, showLoading, hideLoading } from '@/utils/common.js'

Vue.prototype.$formatDate = formatDate
Vue.prototype.$showLoading = showLoading
Vue.prototype.$hideLoading = hideLoading

2.3 在组件中使用

在组件中使用这些方法时,可以通过this.$方法名访问。例如:

// MyComponent.vue

export default {
  methods: {
    handleClick() {
      this.$showLoading('正在加载,请稍后...')
      // 发送请求...
      this.$hideLoading()
    }
  }
}

3. 示例说明

下面是两个具体的示例,分别是一个全局的loading组件和一个全局的message组件。

3.1 全局loading组件

这是一个全局的loading组件,它会在网络请求时显示loading动画。

// /components/Loading.vue

<template>
  <div class="loading" v-show="show">
    <i class="icon-loading"></i>
    <span>{{ message }}</span>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        show: false, // 是否显示loading
        message: '' // loading提示信息
      }
    },
    created() {
      this.$on('showLoading', this.handleShowLoading)
      this.$on('hideLoading', this.handleHideLoading)
    },
    methods: {
      handleShowLoading(msg) {
        this.message = msg || '正在加载...'
        this.show = true
      },
      handleHideLoading() {
        this.show = false
      }
    }
  }
</script>

<style scoped>
  .loading {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    background: rgba(0, 0, 0, 0.5);
  }

  .loading i {
    margin-bottom: 10px;
    font-size: 24px;
  }

  .loading span {
    font-size: 14px;
    color: #fff;
  }
</style>

将该组件挂载到全局,以便在所有组件中使用。

import Vue from 'vue'
import Loading from '@/components/Loading.vue'

Vue.component('Loading', Loading)

最后,在API请求时,可以通过发布订阅模式来显示、隐藏loading组件。

import axios from 'axios'

axios.interceptors.request.use(config => {
  Vue.prototype.$showLoading('正在加载,请稍后...')
  return config
}, error => {
  Vue.prototype.$hideLoading()
  // 处理请求错误
  return Promise.reject(error)
})

axios.interceptors.response.use(response => {
  Vue.prototype.$hideLoading()
  // 处理响应数据
  return response.data
}, error => {
  Vue.prototype.$hideLoading()
  // 处理响应错误
  return Promise.reject(error)
})

3.2 全局message组件

这是一个全局的message组件,它会在需要提示用户操作结果的时候,显示一个浮层提示。

// /components/Message.vue

<template>
  <div class="message-wrapper" v-show="show">
    <div class="message-box" :class="type">
      <i class="icon-close" @click="handleClose"></i>
      <div class="message-text">{{ text }}</div>
    </div>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        show: false,
        type: '',
        text: ''
      }
    },
    created() {
      this.$on('showMessage', this.handleShowMessage)
      this.$on('hideMessage', this.handleHideMessage)
    },
    methods: {
      handleShowMessage({type, text}) {
        this.type = type || 'info'
        this.text = text || '提示'
        this.show = true
        setTimeout(this.handleHideMessage, 3000)
      },
      handleHideMessage() {
        this.show = false
      },
      handleClose() {
        this.handleHideMessage()
      }
    }
  }
</script>

<style scoped>
  .message-wrapper {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .message-box {
    position: relative;
    width: 300px;
    padding: 15px;
    border-radius: 5px;
    background: #fff;

    display: flex;
    justify-content: space-between;
    align-items: center;
    box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2);
  }

  .message-box.success {
    background: #ecf8ec;
  }

  .message-box.warning {
    background: #fff4d9;
  }

  .message-box.error {
    background: #fbe5e5;
  }

  .message-box i {
    position: absolute;
    top: 5px;
    right: 5px;
    font-size: 16px;
    font-weight: bold;
    color: #999;
    cursor: pointer;
  }

  .message-text {
    font-size: 14px;
    color: #333;
  }
</style>

将该组件挂载到全局。

import Vue from 'vue'
import Message from '@/components/Message.vue'

Vue.component('Message', Message)

最后,在需要提示用户操作结果的地方,可以通过发布订阅模式来显示提示。

// 提示成功
Vue.prototype.$messageSuccess = function(text) {
  this.$emit('showMessage', {type: 'success', text})
}

// 提示警告
Vue.prototype.$messageWarning = function(text) {
  this.$emit('showMessage', {type: 'warning', text})
}

// 提示错误
Vue.prototype.$messageError = function(text) {
  this.$emit('showMessage', {type: 'error', text})
}

4. 总结

通过将常用的公共方法抽离出来,并挂载到Vue原型链上,可以提升开发效率,减少代码冗余。在实际开发中,我们还可以把公共的逻辑抽象成一个类或者混入,以便更好地复用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现公共方法抽离 - Python技术站

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

相关文章

  • 关于Vue v-on指令的使用

    关于Vue v-on指令的使用 在Vue中使用v-on指令可以实现事件监听和处理,常用于页面交互中。下面详细介绍v-on指令的使用方法。 语法 v-on指令是Vue提供的一种事件绑定方法,语法如下: v-on:事件名="事件处理函数" 其中,事件名指绑定的事件名称,事件处理函数是一个在Vue实例中定义的方法。 示例说明 示例1:点击事件 …

    Vue 2023年5月27日
    00
  • vue深度监听(监听对象和数组的改变)与立即执行监听实例

    Vue.js 是一个非常流行的前端框架,它提供了很多方便的数据监听和响应式机制,其中包括深度监听和立即执行监听。下面将详细介绍这两种监听方式的用法和示例。 Vue 深度监听 Vue 的深度监听可以在属性改变时触发回调函数,包括对象和数组的改变。Vue 提供了 watch API 来实现深度监听,它可以监听一个对象的所有属性变化,同时也可以监听数组的变化。下面…

    Vue 2023年5月28日
    00
  • vue项目打包部署后默认路由不正确的解决方案

    首先,我们需要理解打包过程中的路由问题。在vue项目中,路由由路由表文件(router/index.js)控制,如果不指定默认路由,就会采用默认的路由配置方式,即会访问localhost:8080/#/,但是在部署后,如果直接访问网站地址,就无法正确渲染网页,因为在服务器中,项目的router.base需要指定为网站地址,而不是默认的localhost:80…

    Vue 2023年5月28日
    00
  • vant 时间选择器–开始时间和结束时间实例

    vant 时间选择器是一个基于Vue.js的组件库,其中包含了常用的时间选择器组件。下面就详细讲解vant 时间选择器的开始时间和结束时间实例的攻略。 一、引入组件 在使用 vant 时间选择器组件之前,需要先在项目中引入这个组件库。 <!– 引入样式文件 –> <link rel="stylesheet" href…

    Vue 2023年5月29日
    00
  • Vue2响应式系统之set和delete

    Vue2的响应式系统是Vue框架的核心特性之一,它能够非常方便地让我们做到数据和视图的同步更新。其中,set和delete是两个非常重要的方法,它们可以用来动态地添加、修改和删除响应式的数据属性。下面,我们就来详细讲解一下这两个方法的使用方法。 set方法 set方法的作用是在Vue实例中添加响应式属性,并给它赋一个初始值。它的语法如下: Vue.set(o…

    Vue 2023年5月29日
    00
  • 详解如何搭建mpvue框架搭配vant组件库的小程序项目

    下面是详解如何搭建mpvue框架搭配vant组件库的小程序项目的完整攻略。 步骤1:准备工作 在开始搭建之前,我们需要准备以下工具和环境: Node.js LTS版本 mpvue-cli脚手架工具 Vant Weapp组件库 如果你已经安装好了Node.js和mpvue-cli,可以直接通过以下命令安装Vant Weapp: npm i vant-weapp…

    Vue 2023年5月27日
    00
  • Vue数据与事件绑定以及Class和Style的绑定详细讲解

    下面来详细讲解Vue数据与事件绑定以及Class和Style的绑定的相关知识。 Vue数据与事件绑定以及Class和Style的绑定详细讲解 数据绑定 数据绑定是Vue的一大特性,它可以将视图中的数据和真实数据进行双向绑定。在Vue中,我们通过v-model和{{}}两种方式实现数据绑定。 v-model v-model指令可以用于在表单控件或组件上创建双向…

    Vue 2023年5月27日
    00
  • vue项目中安装less依赖的过程

    当我们在Vue项目中需要使用less预编译器作为样式开发工具时,需要安装less依赖并进行配置,下面是安装less依赖的完整攻略。 步骤1:安装less依赖 我们可以使用npm或yarn来安装less依赖,以下是两个命令示例: npm安装命令 npm install less less-loader –save-dev yarn安装命令 yarn add …

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