vue组件挂载到全局要领

在近来的项目中,运用了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一同议论进修。

    原文作者:幽丶墨
    原文地址: https://segmentfault.com/a/1190000015843132
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞