vue彈窗插件實(shí)戰(zhàn)代碼
vue做移動(dòng)端經(jīng)常碰到彈窗的需求, 這里寫(xiě)一個(gè)功能簡(jiǎn)單的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: { //顯示的時(shí)長(zhǎng)
type: Number,
default: 3e3
},
},
data(){
return {
visible: false
}
},
methods: {
open() {
this.visible = true
clearTimeout(this.timeout);
this.$emit('show')
if(this.time > 0){
this.timeout = setTimeout(() => {
this.hide()
}, this.time)
}
},
hide() {
this.visible = false
this.$emit('hide')
clearTimeout(this.timeout);
}
}
}
popup.vue只有2個(gè)屬性: 文本和顯示時(shí)間。組件顯示隱藏由內(nèi)部屬性visible控制,只暴露給外界open和hide2個(gè)方法,2個(gè)方法觸發(fā)對(duì)應(yīng)的事件
測(cè)試一下
<template> <popup ref="popup" text="彈窗內(nèi)容" :time="1e3"></popup> </template> <script> import Popup from '@/components/popup' ... this.$refs.popup.open() ... </script>

插件化
組件功能寫(xiě)好了,但是這種調(diào)用方式顯得很累贅。舉個(gè)例子layer.js的調(diào)用就是layer.open(...)沒(méi)有import,沒(méi)有ref,當(dāng)然要先全局引用layer。我們寫(xiě)的彈窗能不能這么方便呢,為此需要把popup改寫(xiě)成vue插件。
說(shuō)是插件,但能配置屬性調(diào)用方法的還是組件本身,具體是實(shí)例化的組件,而且這個(gè)實(shí)例必須是全局單例,這樣不同vue文件喚起popup的時(shí)候才不會(huì)打架
生成單例
// 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
}
組件實(shí)例化后是添加在body上的,props不能寫(xiě)在html里需要js去控制,這里寫(xiě)個(gè)方法讓屬性默認(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)聽(tīng)事件
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)注冊(cè)插件
//main.js
import Vue from 'vue'
import PopupPlugin from '@/plugins/popupPlugin'
Vue.use(PopupPlugin)
在vue框架內(nèi)調(diào)用就非常方便了
<script>
...
this.$popup.text('彈窗消息')
...
</script>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Element上傳組件beforeUpload上傳前限制失效問(wèn)題
這篇文章主要介紹了Element上傳組件beforeUpload上傳前限制失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
詳解在vue-cli項(xiàng)目中安裝node-sass
本篇文章主要介紹了詳解在vue-cli項(xiàng)目中安裝node-sass ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
詳解利用 Vue.js 實(shí)現(xiàn)前后端分離的RBAC角色權(quán)限管理
本篇文章主要介紹了利用 Vue.js 實(shí)現(xiàn)前后端分離的RBAC角色權(quán)限管理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09
vue el-select與el-tree實(shí)現(xiàn)支持可搜索樹(shù)型
本文主要介紹了vue el-select與el-tree實(shí)現(xiàn)支持可搜索樹(shù)型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
vue element-ui表格自定義動(dòng)態(tài)列具體實(shí)現(xiàn)
這周工作中遇見(jiàn)了一個(gè)表格動(dòng)態(tài)列的需求,下面這篇文章主要給大家介紹了關(guān)于vue element-ui表格自定義動(dòng)態(tài)列具體實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
vue實(shí)現(xiàn)類似淘寶商品評(píng)價(jià)頁(yè)面星級(jí)評(píng)價(jià)及上傳多張圖片功能
最近在寫(xiě)一個(gè)關(guān)于vue的商城項(xiàng)目,然后集成在移動(dòng)端中,開(kāi)發(fā)需求中有一界面,類似淘寶商城評(píng)價(jià)界面!接下來(lái)通過(guò)本文給大家分享vue實(shí)現(xiàn)類似淘寶商品評(píng)價(jià)頁(yè)面星級(jí)評(píng)價(jià)及上傳多張圖片功能,需要的朋友參考下吧2018-10-10
基于Vue實(shí)現(xiàn)tab欄切換內(nèi)容不斷實(shí)時(shí)刷新數(shù)據(jù)功能
在項(xiàng)目開(kāi)發(fā)中遇到這樣需求,就是有幾個(gè)tab欄,每個(gè)tab欄對(duì)應(yīng)的ajax請(qǐng)求不一樣,內(nèi)容區(qū)域一樣,內(nèi)容為實(shí)時(shí)刷新數(shù)據(jù),實(shí)現(xiàn)方法其實(shí)很簡(jiǎn)單的,下面小編給大家?guī)?lái)了基于Vue實(shí)現(xiàn)tab欄切換內(nèi)容不斷實(shí)時(shí)刷新數(shù)據(jù)功能,需要的朋友參考下吧2017-04-04
vue axios攔截器常用之重復(fù)請(qǐng)求取消
我們大家在開(kāi)發(fā)中,經(jīng)常會(huì)遇到接口重復(fù)請(qǐng)求導(dǎo)致的各種問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于axios攔截器之重復(fù)請(qǐng)求取消的相關(guān)資料,需要的朋友可以參考下2021-09-09
Vue組件實(shí)現(xiàn)旋轉(zhuǎn)木馬動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Vue組件實(shí)現(xiàn)旋轉(zhuǎn)木馬動(dòng)畫(huà)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

