在不使用ElementUI的情况下,一个很常见的功能就是全局插件通知栏,或者是消息框,在每个组件中使用this.$message()这种简单的形式,是最方便的,所有开发一个全局组件,或者是插件,是最好的方式。
1.编写组件
新建vue文件,里面和常规的组件编写没有区别,都包含了template、script和style三部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| <template> <div class="message-box" v-if="isShowMessageBox"> <span class="msg">{{content}}</span> </div> </template>
<script> export default { props: { content: { type: String, default: '这是弹框内容' } }, data () { return { isShowMessageBox:false, duration:2000 }; }, methods: { showMsgBox: function () { this.isShowMessageBox = true; this.remove(); }, remove: function () { setTimeout(() => { this.destroy(); }, this.duration); }, destroy: function () { this.isShowMessageBox=false; } } }; </script>
<style lang="scss" scoped> .message-box { position:fixed; z-index:100001; top:20px; background:#fff; text-align:center; left:50%; transform:translateX(-50%); border-radius: 4px; box-shadow: 0 0 3px rgba(0,0,0,0.7); padding:20px; font-size: 15px; } </style>
|
2.编写install函数
主要作用就是将插件实例化,然后挂载到Vue的prototype上,定义插件对象,编写插件的install方法,通过Vue.extend扩展Vue,然后通过appendClild将插件的html添加到body上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import msgboxVue from './index.vue';
const MessageBox = {};
MessageBox.install = function (Vue, options) { const MessageBoxInstance = Vue.extend(msgboxVue); let currentMsg; const initInstance = () => { currentMsg = new MessageBoxInstance(); let msgBoxEl = currentMsg.$mount().$el; document.body.appendChild(msgBoxEl); }; Vue.prototype.$msgBox=(options) => { if (!currentMsg) { initInstance(); } if (typeof options === 'string') { currentMsg.content = options; } else if (typeof options === 'object') { Object.assign(currentMsg, options); } currentMsg.showMsgBox(); } }; export default MessageBox;
|
3.全局注册插件
在main.js或其他地方,通过Vue.use将Message注册为全局组件。
1 2
| import Message from '@/components/MessageBox/index' Vue.use(Message);
|
4.在其他地方使用插件
在适当的地方调用this.$msgBox即可。
1 2 3 4 5
| this.$msgBox('没有相关数据');
this.$msgBox({ duration:3000 });
|