vue如何通过事件的形式调用全局组件

 更新时间:2024年09月03日 09:06:24   作者:看客随心  
这篇文章主要介绍了vue如何通过事件的形式调用全局组件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue通过事件的形式调用全局组件

创建组件

这里我是写了一个文件上传组件

<template>
    <el-dialog :title="title" :visible.sync="open" width="400px" :before-close="handleClose" append-to-body>
        <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="headers"
            :action="baseApi + url + '?updateSupport=' + updateSupport" :disabled="isUploading"
            :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
            <i class="el-icon-upload"></i>
            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
            <div class="el-upload__tip text-center" slot="tip">
                <div class="el-upload__tip" slot="tip">
                    <el-checkbox v-model="updateSupport"> 是否更新已经存在的数据</el-checkbox>
                </div>
                <span>仅允许导入xls、xlsx格式文件。</span>
                <el-link v-if="tempUrl" type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
            </div>
        </el-upload>
        <div slot="footer" class="dialog-footer">
            <el-button type="primary" @click="submitFileForm">确 定</el-button>
            <el-button @click="handleClose">取 消</el-button>
        </div>
    </el-dialog>
</template>
<script>
import { getToken } from "@/utils/auth";
export default {
    props: {
        url: {
            type: String,
        },
        tempUrl: {
            type: String,
        },
        title: {
            type: String,
            default: "数据导入"
        },
        open: {
            type: Boolean,
            default: false
        },
        // 是否更新已经存在的用户数据
        updateSupport: {
            type: Number,
            default: 0
        },
        callback: Function
    },
    data() {
        return {
            loading: undefined,
            baseApi: process.env.VUE_APP_BASE_API,
            headers: { Authorization: "Bearer " + getToken() },
            isUploading: false
        }
    },
    methods: {
        // 下载模板操作
        importTemplate() {
            this.download(this.$props.tempUrl, {
            }, `${this.$props.title}模板_${new Date().getTime()}.xlsx`)
        },
 
        // 文件上传中处理
        handleFileUploadProgress(event, file, fileList) {
            this.isUploading = true;
            this.loading = this.$loading({
                lock: true,
                text: 'Loading',
                spinner: 'el-icon-loading',
                background: 'rgba(0, 0, 0, 0.7)'
            });
        },
 
        // 文件上传成功处理
        handleFileSuccess(response) {
            this.isUploading = false;
            this.$refs.upload.clearFiles();
            this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
            this.handleClose();
            this.$props.callback && this.$props.callback();
        },
 
        // 提交上传文件
        submitFileForm() {
            this.$refs.upload.submit();
        },
 
        // 模态框关闭
        handleClose() {
            this.loading && this.loading.close();
            this.$refs.upload.clearFiles();
            this.$importModel.hide();
        }
    }
}
</script>
 
<style></style>

全局挂载

通过vue.use 挂载组件,然后在vue 原型上添加属性, 再通过调用属性方法传参的形式控制组件。

import ImportModel from './index.vue'
import { Message } from 'element-ui';
 
const ImportComponent = {
    install(Vue) {
        // 创建组件构造函数
        const ImportInstance = Vue.extend(ImportModel);
        let component;
        const initInstance = () => {
            component = new ImportInstance();
            let mountDom = component.$mount().$el;
            document.body.appendChild(mountDom);
        }
        // 全局挂载组件方法
        Vue.prototype.$importModel = {
            // 显示模态框
            show(option) {
                if(!option.url) return Message.error("上传地址必填!");
                initInstance();
                component.open = true;
                Object.assign(component, option);
            },
            // 关闭模态框
            hide() {
                component.open = false;
                let mountDom = component.$mount().$el;
                document.body.removeChild(mountDom);
            }
        };
    }
};
 
export default ImportComponent;

调用全局属性方法并传参

/**
     * 导入操作
     */
    handleImport() {
      this.$importModel.show({
        url: this.queryConfig.importUrl,
        tempUrl: this.queryConfig.importTempUrl,
        title: this.tableName || null,
        callback: () => {
          this.handleQuery();
        }
      })
    },
 

在Vue项目中使用全局组件

1.在 @/components/common创建两个组件

  • Logo.vue
  • MyIcon.vue

2.在@/components/common中创建index.js

import Logo from './Logo.vue'
import MyIcon from './MyIcon.vue'

const components = {
    install(Vue){
        Vue.component("Logo",Logo)
        Vue.component("MyIcon",MyIcon)
    }
}
export default components

3.在main.js中加入代码

//引入全局组件
import Components from '@/components/common'
Vue.use(Components)

4.在任意一个组件中直接使用这两个全局组件

<template>
  <div class="home">
    <my-icon></my-icon>
    <logo></logo>
   </div>
</template>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue使用三方工具vueUse实现虚拟列表

    Vue使用三方工具vueUse实现虚拟列表

    其实采用vueUse中的useVirtualList方法同样可以实现虚拟列表,这篇文章小编就来和大家详细介绍一下如何使用vueUse实现简单的虚拟列表效果吧
    2024-04-04
  • 基于Vue CSR的微前端实现方案实践

    基于Vue CSR的微前端实现方案实践

    这篇文章主要介绍了基于Vue CSR的微前端实现方案实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Vue项目报错:Uncaught SyntaxError: Unexpected token '<'的解决方法

    Vue项目报错:Uncaught SyntaxError: Unexpected token '<&a

    最近在做vue项目时,需要引入一个第三方的js文件,在index.html中通过以下方式引入JS文件编译后就报了这个问题,这篇文章主要给大家介绍了关于Vue项目报错:Uncaught SyntaxError: Unexpected token '<'的解决方法,需要的朋友可以参考下
    2022-08-08
  • vue.js如何将echarts封装为组件一键使用详解

    vue.js如何将echarts封装为组件一键使用详解

    Echarts 、 Remodal和Pikaday是我们在开发后台管理类网站时常用的三个第三方组件,下面这篇文章主要给大家介绍了关于vue.js如何将echarts封装为组件一键使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-10-10
  • 去除element-ui下拉框的下拉箭头的实现

    去除element-ui下拉框的下拉箭头的实现

    我们最开始拿到的element-ui是带有下拉箭头的,那么如何去除element-ui下拉框的下拉箭头的实现,本文就详细的介绍一下,感兴趣的可以了解一下
    2023-08-08
  • antd Select下拉菜单动态添加option里的内容操作

    antd Select下拉菜单动态添加option里的内容操作

    这篇文章主要介绍了antd Select下拉菜单动态添加option里的内容操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Vue+Element Plus实现自定义日期选择器

    Vue+Element Plus实现自定义日期选择器

    这篇文章主要为大家详细介绍了如何基于Vue和Element Plus提供的现有组件,设计并实现了一个自定义的日期选择器组件,感兴趣的小伙伴可以参考一下
    2024-12-12
  • vue中el-table表格的表头操作代码

    vue中el-table表格的表头操作代码

    本文通过实例代码介绍对el-table表格的表头操作方法,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • vue实现登录页面的验证码以及验证过程解析(面向新手)

    vue实现登录页面的验证码以及验证过程解析(面向新手)

    这篇文章主要介绍了vue实现登录页面的验证码以及验证过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • vue数组双向绑定问题及$set用法说明

    vue数组双向绑定问题及$set用法说明

    这篇文章主要介绍了vue数组双向绑定问题及$set用法说明,具有很好的参考价值,希望大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09

最新评论