vue如何通过事件的形式调用全局组件
作者:看客随心
这篇文章主要介绍了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>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。