vue实现公共方法抽离

下面是“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中点击url下载文件的案例详解

    以下是关于“Vue中点击URL下载文件的案例详解”的完整攻略,包括两个示例说明: 1. Vue中点击URL下载文件的步骤 步骤一:后端实现文件下载接口 在后端通过开放接口供前端进行文件下载。具体实现方式依据后端开发框架、技术选型等情况而有所差异。 步骤二:前端实现文件下载 前端通过调用后端提供的文件下载接口来实现文件下载。从Vue角度看,实现文件下载主要分为…

    Vue 2023年5月28日
    00
  • Vue实现多标签选择器

    确定需求 首先,我们需要明确自己的需求,即实现一个多标签选择器,让用户能够方便地选择多个标签进行操作。在确定需求的时候,我们需要考虑如下问题: 该多标签选择器需要支持哪些操作,比如添加标签、删除标签、清空标签等等。 该多标签选择器是否需要支持搜索,用户可以搜索标签进行选择。 多标签选择器的样式应该如何设计,方便用户使用。 在确认好需求之后,我们就可以着手开始…

    Vue 2023年5月27日
    00
  • Vue实现模糊查询的简单方法实例

    下面是“Vue实现模糊查询的简单方法实例”的完整攻略,包括两条示例说明。 1. 概述 Vue可以方便地实现数据的绑定和渲染,而模糊查询是我们经常需要使用的一个功能,因此在Vue中实现模糊查询是非常实用的。本文将介绍两种实现Vue模糊查询的简单方法,分别是使用computed属性和使用自定义过滤器。 2. 使用computed属性 首先,我们在Vue实例中定义…

    Vue 2023年5月29日
    00
  • 如何在Vue3中实现自定义指令(超详细!)

    下面是关于如何在Vue3中实现自定义指令的完整攻略。 什么是自定义指令 在Vue中,指令是一种带有v-前缀的特殊属性。指令具有独特的行为和功能,例如v-bind可以将元素的属性与Vue实例中的数据绑定,v-on可以监听事件等。Vue允许我们注册自己的自定义指令。 在Vue3中注册自定义指令 在Vue3中,我们可以使用DirectiveAPI来注册自定义指令。…

    Vue 2023年5月28日
    00
  • vue 表单输入格式化中文输入法异常问题

    下面将详细讲解“vue 表单输入格式化中文输入法异常问题”的攻略: 什么是格式化表单输入? 格式化表单输入是指将用户输入的数据按照一定格式进行处理,以达到方便用户阅读和使用的目的。比如,将用户输入的手机号码在每四位数字之间加上一个空格或短横线,或者将用户输入的银行卡号在每四位数字之间添加空格。 vue 表单输入格式化中文输入法异常问题 在使用 vue 编写表…

    Vue 2023年5月28日
    00
  • Vue自定义指令详解

    Vue自定义指令详解 基本概念 Vue自定义指令是Vue.js提供的一种扩展语法,用于自定义DOM操作行为。 自定义指令通过v-前缀来定义,并且可以带有参数和修饰符两个部分。 注册自定义指令 // 全局注册 Vue.directive(‘my-directive’, { // 自定义指令的钩子函数 bind: function (el, binding, v…

    Vue 2023年5月27日
    00
  • 详解离线安装npm包的几种方法

    当我们需要使用npm包时,通常我们会使用npm命令在线安装。但是,某些情况下我们可能需要离线安装npm包,比如网络环境不佳或无法联网的情况下。 本文将为大家详细讲解“详解离线安装npm包的几种方法”。 方法一:使用npm install命令 在网络良好的情况下,可以使用npm install命令将需要的npm包从线上下载到本地文件系统,这样就可以在没有网络的…

    Vue 2023年5月28日
    00
  • 详解vue-meta如何让你更优雅的管理头部标签

    下面是详解vue-meta如何让你更优雅的管理头部标签的攻略。 什么是vue-meta? vue-meta 是在Vue中操作头部标签(meta 标签、title 标签等等)的一个插件。通过 vue-meta 可以让我们在 Vue 组件内方便的定义和修改这些标签。使用 vue-meta ,我们可以更加方便和优雅的管理头部标签,从而使得我们的网站更加 SEO 友…

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