测试环境:nodejs+webpack,例子是看文章的,注释为本身的理解vue
建立一个toast.vue文件:node
<template>
<div class="wrap" v-if="show">
<div>{{text}}</div>
<div>{{temp1}}</div>
</div>
</template>
<script> export default { data () { return { temp1 : "你好vbyzc" } } } </script>
<style scoped> .wrap{ color:#fff; background-color: rgba(0,0,0,0.8); padding: 10px; position: fixed; top:50%;left: 50%; border-radius: 10px;; } </style>
建立一个toast_index.jswebpack
import vue from 'vue' import toastComponent from './toast'
//使用vue的extend,以vue文件为基础组件,返回一个能够建立vue组件的特殊构造函数
const ToastConstructor = vue.extend(toastComponent)
function showToast(text,duration = 2000){ const toastDom = new ToastConstructor({ el : document.createElement('div'), data(){ return { text:text, show:true } } })
//在body中动态建立一个div元素,后面自动会把它替换成整个vue文件内的内容 document.body.appendChild(toastDom.$el) setTimeout(() => {toastDom.show=false},duration) } function registryToast (){ //把showToast这个方法添加到uve的原型中,能够直接调用,当调用的时候就是执行函数内的内容
vue.prototype.$toast = showToast } export default registryToast
最后一步,在入口js文件中:web
import toastRegistry from './components/toast_index.js'//用这个方法注册组件,全部vue页面均可以使用,不用再import //定义全局组件生成的有2个种方法,一种myPlugin={install(){...}},一种function myPlugin(){....} //vue.use方法内部,会判断toastRegistry,若是是函数就直接执行,若是是object则执行它的install对象
//导为导入的toastRegistry是一个函数,因此也能够直接执行toastRegistry()
Vue.use(toastRegistry)
在任何vue文件中使用它:app
<button @click="modifySendvalue">改传输到子组件的值</button>
showToast(){ this.$toast('哈哈哈哈'); }
总结:dom