在近来的项目中,运用了bootstrap-vue来开辟,然而在现实的开辟过程当中却发明这个UI供应的组件并不能打到我们预期的结果,像alert、modal等组件每一个页面引入就得反复引入,并不像element那样能够经由过程this.$xxx来挪用,那末题目来了,怎样经由过程this.$xxx来挪用起我们定义的组件或对我们所运用的UI框架的组件呢。
以bootstrap-vue中的Alert组件为例,分一下几步举行:
1、定义一个vue文件完成对原组件的再次封装
main.vue
<template>
<b-alert
class="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 = id
instance.vm = instance.$mount()
document.body.appendChild(instance.vm.$el)
instance.vm.$el.style.zIndex = index
return 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-modal
v-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 = id
instance.vm = instance.$mount()
document.body.appendChild(instance.vm.$el)
instance.vm.$el.style.zIndex = index
return instance.vm
}
return confirmMsg
}
})
}
export default install
求知的欲望,是不断进修的动力。路漫漫其修远兮,吾将高低而求索。迎接加我QQ:2360263057一同议论进修。