91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue中怎么實現一個彈窗插件

發布時間:2021-06-17 15:00:06 來源:億速云 閱讀:135 作者:Leah 欄目:web開發

vue中怎么實現一個彈窗插件,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

popup.vue

<template>
 <div class="popup-wrapper" v-show="visible" @click="hide">
  <div class="popup-text">{{text}}</div>
 </div>
</template>

組件html結構, 外層divposition:fixed定位, 內層div顯示彈窗內容

export default {
 name: 'popup',
 props: {
  text: { //文字內容
   type: String,
   default: ''
  },
  time: { //顯示的時長
   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個屬性: 文本和顯示時間。組件顯示隱藏由內部屬性visible控制,只暴露給外界open和hide2個方法,2個方法觸發對應的事件

測試一下

<template>
 <popup ref="popup" text="彈窗內容" :time="1e3"></popup>
</template>
<script>
import Popup from '@/components/popup'
 ...
  this.$refs.popup.open()
  ...
</script>

vue中怎么實現一個彈窗插件

插件化

組件功能寫好了,但是這種調用方式顯得很累贅。舉個例子layer.js的調用就是layer.open(...)沒有import,沒有ref,當然要先全局引用layer。我們寫的彈窗能不能這么方便呢,為此需要把popup改寫成vue插件。
說是插件,但能配置屬性調用方法的還是組件本身,具體是實例化的組件,而且這個實例必須是全局單例,這樣不同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去控制,這里寫個方法讓屬性默認值繼續發揮作用

// 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)
    //監聽事件
    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內注冊插件

//main.js
import Vue from 'vue'
import PopupPlugin from '@/plugins/popupPlugin'

Vue.use(PopupPlugin)
在vue框架內調用就非常方便了

<script>
 ...
  this.$popup.text('彈窗消息')
 ...
</script>

關于vue中怎么實現一個彈窗插件問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

托里县| 青阳县| 无锡市| 关岭| 融水| 盐池县| 华安县| 读书| 余江县| 文昌市| 长垣县| 正定县| 灵台县| 灌南县| 大渡口区| 壤塘县| 全椒县| 富宁县| 二连浩特市| 远安县| 建水县| 尚义县| 阿拉善左旗| 金寨县| 屏南县| 乌兰察布市| 铜山县| 翁牛特旗| 五台县| 定州市| 泾源县| 湟中县| 达尔| 秭归县| 乌拉特中旗| 安图县| 桃园市| 大姚县| 辽宁省| 高陵县| 武乡县|