vue弹窗插件实战
vue做移動端經(jīng)常碰到彈窗的需求, 這里寫一個功能簡單的vue彈窗
popup.vue
<template><div class="popup-wrapper" v-show="visible" @click="hide"><div class="popup-text">{{text}}</div></div> </template>組件html結(jié)構(gòu), 外層divposition:fixed定位, 內(nèi)層div顯示彈窗內(nèi)容
export default {name: 'popup',props: {text: { //文字內(nèi)容type: String,default: ''},time: { //顯示的時長type: Number,default: 3e3},},data(){return {visible: false}},methods: {open() {this.visible = trueclearTimeout(this.timeout);this.$emit('show')if(this.time > 0){this.timeout = setTimeout(() => {this.hide()}, this.time)}},hide() {this.visible = falsethis.$emit('hide')clearTimeout(this.timeout);}} }popup.vue只有2個屬性: 文本和顯示時間。組件顯示隱藏由內(nèi)部屬性visible控制,只暴露給外界open和hide2個方法,2個方法觸發(fā)對應(yīng)的事件
測試一下
<template><popup ref="popup" text="彈窗內(nèi)容" :time="1e3"></popup> </template> <script> import Popup from '@/components/popup'...this.$refs.popup.open()... </script>
插件化
組件功能寫好了,但是這種調(diào)用方式顯得很累贅。舉個例子layer.js的調(diào)用就是layer.open(...)沒有import,沒有ref,當(dāng)然要先全局引用layer。我們寫的彈窗能不能這么方便呢,為此需要把popup改寫成vue插件。
說是插件,但能配置屬性調(diào)用方法的還是組件本身,具體是實例化的組件,而且這個實例必須是全局單例,這樣不同vue文件喚起popup的時候才不會打架
生成單例
// plugins/popupVm.js import Popup from '@/components/popup' let $vm export const factory = (Vue)=> {if (!$vm) {let Popup = Vue.extend(PopupComponent)$vm = new Popup({el: document.createElement('div')})document.body.appendChild($vm.$el)}return $vm }組件實例化后是添加在body上的,props不能寫在html里需要js去控制,這里寫個方法讓屬性默認(rèn)值繼續(xù)發(fā)揮作用
// plugins/util.js export const setProps = ($vm, options) => {const defaults = {}Object.keys($vm.$options.props).forEach(k => {defaults[k] = $vm.$options.props[k].default})const _options = _.assign({}, defaults, options)for (let i in _options) {$vm.$props[i] = _options[i]} } // plugins/popupPlugin.js import { factory } from './popupVm' import { setProps } from './util'export default {install(Vue) {let $vm = factory(Vue);const popup = {open(options) {setProps($vm, options)//監(jiān)聽事件typeof options.onShow === 'function' && $vm.$once('show', options.onShow);typeof options.onHide === 'function' && $vm.$once('hide', options.onHide);$vm.open();},hide() {$vm.hide()},//只配置文字text(text) {this.open({ text })}}Vue.prototype.$popup = popup} }在main.js內(nèi)注冊插件
//main.js import Vue from 'vue' import PopupPlugin from '@/plugins/popupPlugin'Vue.use(PopupPlugin)在vue框架內(nèi)調(diào)用就非常方便了
<script>...this.$popup.text('彈窗消息')... </script>總結(jié)
- 上一篇: c语言教程的辅导书,清华大学出版社-图书
- 下一篇: html5倒计时秒杀怎么做,vue 设