在最近的项目中,使用了bootstrap-vue来开发,然而在实际的开发过程中却发现这个UI提供的组件并不能打到我们预期的效果,像alert、modal等组件每个页面引入就得重复引入,并不像element那样可以通过this.$xxx来调用,那么问题来了,如何通过this.$xxx来调用起我们定义的组件或对我们所使用的UI框架的组件呢。
以bootstrap-vue中的Alert组件为例,分一下几步进行:

1、定义一个vue文件实现对原组件的再次封装

main.vue
<template><b-alertclass="alert-wrap pt-4 pb-4":show="isAutoClose":variant="type" dismissible:fade="true"@dismiss-count-down="countDownChanged"@dismissed="dismiss">{{msg}}</b-alert>
</template>
<script>
export default {/*** 参考: https://bootstrap-vue.js.org/docs/components/alert* @param {string|number} msg 弹框内容* @param {tstring} type 弹出框类型 对应bootstrap-vue中variant 可选值有:'primary'、'secondary'、'success'、'danger'、'warning'、'info'、'light'、'dark'默认值为 'info'* @param {boolean} autoClose 是否自动关闭弹出框* @param {number} duration 弹出框存在时间(单位:秒)* @param {function} closed 弹出框关闭,手动及自动关闭都会触发*/props: {msg: {type: [String, Number],default: ''},type: {type: String,default: 'info'},autoClose: {type: Boolean,default: true},duration: {type: Number,default: 3},closed: {type: Function,default: null}},methods: {dismiss () {this.duration = 0},countDownChanged (duration) {this.duration = duration}},computed: {isAutoClose () {if (this.autoClose) {return this.duration} else {return true}}},watch: {duration () {if (this.duration === 0) {if (this.closed) this.closed()}}}
}
</script>
<style scoped>
.alert-wrap {position: fixed;width: 600px;top: 80px;left: 50%;margin-left: -200px;z-index: 2000;font-size: 1.5rem;
}
</style>

这里主要就是对组件参数、回调事件的一些处理,与其他处理组件的情况没有什么区别

2、定义一个js文件挂载到Vue上,并和我们定义的组件进行交互

index.js
import Alert from './main.vue'
import Vue from 'vue'
let AlertConstructor = Vue.extend(Alert)
let instance
let seed = 1
let index = 2000
const install = () => {Object.defineProperty(Vue.prototype, '$alert', {get () {let id = 'message_' + seed++const alertMsg = options => {instance = new AlertConstructor({propsData: options})index++instance.id = idinstance.vm = instance.$mount()document.body.appendChild(instance.vm.$el)instance.vm.$el.style.zIndex = indexreturn instance.vm}return alertMsg}})
}
export default install

其主要思想是通过调用这个方法给组件传值,然后append到body下

3、最后需要在main.js中use一下

import Alert from '@/components/alert/index'
Vue.use(Alert)

4、使用

this.$alert({msg: '欢迎━(*`∀´*)ノ亻!'})

5、confrim的封装也是一样的

main.vue
<template><b-modalv-if="!destroy"v-model="isShow"title="温馨提示"@change="modalChange"@show="modalShow"@shown="modalShown"@hide="modalHide"@hidden="modalHidden"@ok="modalOk"@cancel="modalCancel":centered="true":hide-header-close="hideHeaderClose":no-close-on-backdrop="noCloseOnBackdrop":no-close-on-esc="noCloseOnEsc":cancel-title="cancelTitle":ok-title="okTitle"><p class="my-4">{{msg}}</p></b-modal>
</template>
<script>
export default {/*** 参考: https://bootstrap-vue.js.org/docs/components/modal* @param {boolean} isShow 是否显示modal框* @param {string|number} msg 展示内容* @param {boolean} hideHeaderClose 是否展示右上角关闭按钮 默认展示* @param {string} cancelTitle 取消按钮文字* @param {string} okTitle 确定按钮文字* @param {boolean} noCloseOnBackdrop 能否通过点击外部区域关闭弹框* @param {boolean} noCloseOnEsc 能否通过键盘Esc按键关闭弹框* @param {function} change 事件触发顺序: show -> change -> shown -> cancel | ok -> hide -> change -> hidden* @param {function} show before modal is shown* @param {function} shown modal is shown* @param {function} hide before modal has hidden* @param {function} hidden after modal is hidden* @param {function} ok 点击'确定'按钮* @param {function} cancel 点击'取消'按钮* @param {Boolean} destroy 组件是否销毁 在官方并没有找到手动销毁组件的方法,只能通过v-if来实现*/props: {isShow: {type: Boolean,default: true},msg: {type: [String, Number],default: ''},hideHeaderClose: {type: Boolean,default: false},cancelTitle: {type: String,default: '取消'},okTitle: {type: String,default: '确定'},noCloseOnBackdrop: {type: Boolean,default: true},noCloseOnEsc: {type: Boolean,default: true},change: {type: Function,default: null},show: {type: Function,default: null},shown: {type: Function,default: null},hide: {type: Function,default: null},hidden: {type: Function,default: null},ok: {type: Function,default: null},cancel: {type: Function,default: null},destroy: {type: Boolean,default: false}},methods: {modalChange () {if (this.change) this.change()},modalShow () {if (this.show) this.show()},modalShown () {if (this.shown) this.shown()},modalHide () {if (this.hide) this.hide()},modalHidden () {if (this.hidden) this.hidden()this.destroy = true},modalOk () {if (this.ok) this.ok()},modalCancel () {if (this.cancel) this.cancel()}}
}
</script>
index.js
import Confirm from './main.vue'
import Vue from 'vue'
let ConfirmConstructor = Vue.extend(Confirm)
let instance
let seed = 1
let index = 1000
const install = () => {Object.defineProperty(Vue.prototype, '$confirm', {get () {let id = 'message_' + seed++const confirmMsg = options => {instance = new ConfirmConstructor({propsData: options})index++instance.id = idinstance.vm = instance.$mount()document.body.appendChild(instance.vm.$el)instance.vm.$el.style.zIndex = indexreturn instance.vm}return confirmMsg}})
}
export default install

求知的欲望,是不断学习的动力。路漫漫其修远兮,吾将上下而求索。欢迎加我QQ:2360263057一起讨论学习。

vue组件挂载到全局方法相关推荐

  1. vue组件之间传值方式方法---实战面试篇

    vue组件之间传值方式方法 vue组件传值 vue组件化 什么是组件化? vue组件通讯 父组件向子组件传值 子组件向父组件传值 兄弟组件传值 总结 vue组件传值 最近准备面试跳槽.说到前端面试,有 ...

  2. 在Vue组件中获取全局的点击事件

    使用场景: 在Vue组件中点击某元素之外的地方移除该元素 需求: 如上图所示,"用户列表"页面有三个Vue组件组成,分别是"菜单组件","导航组件&q ...

  3. Vue组件之间传值/调用方法的几种方式

    组件之间传值/调用方法的几种方式 (一)父组件向子组件传值==props 1.在父组件中使用子组件的地方绑定数据 <children :message="message"&g ...

  4. vue 组件不受全局样式影响_Vue 组件之间样式冲突

    Vue 组件之间样式冲突 vue 组件化,各组件内都可以在 style 部分写样式,这些样式却不是相互独立的,最终组合在一起,难免就会产生样式的污染. 首先来看一下两个 vue 组件代码: 1.Par ...

  5. vue组件挂载与html加载区别,vue中的挂载是什么意思?

    Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,方 ...

  6. vue 组件不受全局样式影响_组件库引入全局样式lib/style/index.css,会污染全局基础样式...

    I have searched the issues of this repository and believe that this is not a duplicate. Version 1.3. ...

  7. vue避免重新渲染_详解强制Vue组件重新渲染的方法

    在某些情况下,我们必须强制Vue重新渲染组件,如果没有,那可能,你做的业务还不够负责,反正我是经常需要重新渲染组件,哈哈. 虽然Vue不会自动更新这种情况是相对比较少,但是知道如何在出现这个问题时修复 ...

  8. wim linux u盘启动项,WinPE迷你系统中通过WimFltr组件挂载WIM镜像方法

    Microsoft Windows Imaging Format (WIM) 映像是MS新型的映像文件,具有高压缩比.挂接方便.挂接内存小等特点.在XP/2K3的winpe中通过挂接WIM作为外置程序 ...

  9. vue 父子组件传值以及方法调用,平行组件之间传值以及方法调用大全

    vue项目经常需要组件间的传值以及方法调用,具体场景就不说了,都知道.基本上所有的传值都可以用vuex状态管理来实现,只要在组件内监听vuex就好. vue常用的传值方式以及方法有: 1. 父值传子( ...

  10. vue拿到某个节点的属性_vue实现将某个dom元素或组件挂载到根节点

    在写手机端的时候经常用到tab,tab切换一般都是transition滑动的,如果此时我们用position:fixed定位会发现,元素定位并不是我们想象中的相对浏览器定位,这是因为fixed定位会被 ...

最新文章

  1. 【题解】P1508 Likecloud-吃、吃、吃(简单DP)
  2. 世界级安全技术专家力作——《Linux防火墙》
  3. [Nikon D80]Beauty
  4. message from server: Host 'XXXX' is not allowed to connect to this MySQL server
  5. boost::mp11::mp_empty相关用法的测试程序
  6. QT的QWinTaskbarButton类的使用
  7. web 折线图大数据量拉取展示方案_分布式、服务化的企业级 ERP 系统架构设计方案...
  8. 插件代码_我们开源了一款 SonarQube iOS 代码扫描插件
  9. 30秒Python轻松入门-目录
  10. 中国电信:5G 手机可实现不换卡号;新西兰否认禁用华为;Visual Studio 2019 正式发布!| 极客头条...
  11. 原在一个tableView上应用不同类型的DTAttributedTextCell
  12. 有关风向及风向处理的笔记
  13. 面试:Android数据库升级给表增加字段
  14. 短距离无线传输-WIFI
  15. 获取当前日期的上一个月和后三个月。
  16. ruby on rails validates uniqueness
  17. ubuntu删除旧的linux内核
  18. 爬取manhua.fzdm.com上的妖尾漫画
  19. 为什么我的CNN石乐志?我只是平移了一下图像而已
  20. 一文解决Opencv四大经典算子——sobel算子、scharr算子、laplacian算子、canny算子

热门文章

  1. 数据结构-单链表的正向排序
  2. Android Studio Debug按钮简介
  3. HP 招聘性能测试PM 北京/上海 长期招聘
  4. SimpleDateFormat多线程下的安全问题(解决方法)
  5. mysql中locate和substring函数使用
  6. C# 线程thread
  7. word中的总页数不包括封面、目录
  8. Git配置信息相关命令
  9. 2018.11.09 bzoj4773: 负环(倍增+floyd)
  10. Java API方式调用Kafka各种协议