1. 通过官方提供的一个全局api Vue.extend( options )
import Vue from 'vue' export default (component, props) => { const conCtor = Vue.extend(component) const el = new conCtor({propsData: props}).$mount() document.body.appendChild(el.$el) conCtor.remove = () => { document.body.removeChild(el.$el) conCtor.$destroy() } return el }
2. 通过new 一个Vue对象,通过这个Vue对象的render函数帮我们渲染这个虚拟dom
import Vue from 'vue' export const create = (component, props) => { const vm = new Vue({ render(h) { return h(component, {props}) } }).$mount() document.body.appendChild(vm.$el) vm.remove = () => { document.body.removeChild(vm.$el) vm.$destroy() } return vm.$children[0] }
以上两个方法均为生成一个挂在全局组件的工厂函数,可通过该函数生成任何需要全局挂在的组件。现举一个栗子,开发一个提示框(notice)组件,并使用上述函数挂在全局。
1. 开发组件
<template> <transition name="notice"> <div class="notice-wrapper" v-if="isShow"> <div class="notice-content"> <h5 class="header">{{title}}</h5> <div class="body">{{content}}</div> </div> </div> </transition> </template> <script> export default { data() { return { isShow: false } }, props: { title: { type: String, default: '提示' }, content: { type: String, default: '' }, duration: { type: Number, default: 3000 } }, mounted() { this.isShow = true }, created() { if (this.duration === 0) return this.timer = setTimeout(() => { this.isShow = false }, this.duration) }, methods: { hide() { this.isShow = false } } } </script> <style scoped lang="less"> .notice-wrapper { position: absolute; height: 100%; 100%; left: 0; top: 0; background: inherit; &::after { content: ''; position: absolute; display: block; left: 0; top: 0; height: 100%; 100%; background: #eee; opacity: 0.1; } .notice-content { position: relative; box-sizing: border-box; 80%; margin: 0 auto; top: 50%; transform: translateY(-50%); padding: 10px; background: #1989fa; color: #fff; box-shadow: 0px 0px 2px 2px #ccc; border-radius: 5px; .header { padding: 0 0 20px 0; margin: 0; font-size: 16px; } } } .notice-enter, .notice-leave-to { opacity: 0; } .notice-enter-active, .notice-leave-active { transition: opacity 0.5s; } </style>
2. 暴露组件挂载全局的注册方法install,以及便捷封装方法success以及fail
import NoticeComponent from './Notice.vue' import createComponent from '../utils/create-component.js' export default { install(Vue) { Vue.prototype.createNotice = (props) => createComponent(NoticeComponent, props) }, success(props) { props = Object.assign({title: '提示'}, props) return createComponent(NoticeComponent, props) }, fail(props) { props = Object.assign({title: '警告'}, props) return createComponent(NoticeComponent, props) } }
3. 组件使用
使用方式1:全局注册
//mian.js 注册 import Notice from '../packages/notice' Vue.use(Notice) //任意组件页面使用 this.createNotice({ title: '提示', content: '服务器错误', duration: 5000 })
使用方式2:快捷方式使用
import Notice from '../packages/notice' Notice.fail({content: '服务器错误'}) Notice.success({ content: '操作成功', duration: 5000 })
没有了!!!