真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

vue中怎么實(shí)現(xiàn)一個(gè)彈窗插件

vue中怎么實(shí)現(xiàn)一個(gè)彈窗插件,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)建站主營(yíng)輪臺(tái)網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶App定制開(kāi)發(fā),輪臺(tái)h5小程序開(kāi)發(fā)搭建,輪臺(tái)網(wǎng)站營(yíng)銷(xiāo)推廣歡迎輪臺(tái)等地區(qū)企業(yè)咨詢(xún)

popup.vue

組件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è)試一下


vue中怎么實(shí)現(xiàn)一個(gè)彈窗插件

插件化

組件功能寫(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)用就非常方便了

關(guān)于vue中怎么實(shí)現(xiàn)一個(gè)彈窗插件問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


網(wǎng)站標(biāo)題:vue中怎么實(shí)現(xiàn)一個(gè)彈窗插件
標(biāo)題鏈接:http://weahome.cn/article/ipiech.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部