博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue弹窗插件实战
阅读量:6718 次
发布时间:2019-06-25

本文共 2326 字,大约阅读时间需要 7 分钟。

vue做移动端经常碰到弹窗的需求, 这里写一个功能简单的vue弹窗

popup.vue

组件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个方法触发对应的事件

测试一下

图片描述

插件化

组件功能写好了,但是这种调用方式显得很累赘。举个例子layer.js的调用就是layer.open(...)没有import,没有ref,当然要先全局引用layer。我们写的弹窗能不能这么方便呢,为此需要把popup改写成vue插件。

说是插件,但能配置属性调用方法的还是组件本身,具体是实例化的组件,而且这个实例必须是全局单例,这样不同vue文件唤起popup的时候才不会打架

生成单例

// plugins/popupVm.jsimport Popup from '@/components/popup'let $vmexport 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.jsexport 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.jsimport { 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.jsimport Vue from 'vue'import PopupPlugin from '@/plugins/popupPlugin'Vue.use(PopupPlugin)

在vue框架内调用就非常方便了

转载地址:http://asumo.baihongyu.com/

你可能感兴趣的文章
基于WinSvr2012共享文件夹的Hyper-V实时迁移之三实时迁移的实现及验证
查看>>
证件照片换背景
查看>>
并发编程笔记二:synchronized锁住了谁?
查看>>
js打字效果
查看>>
用铁路局来比喻流程管理系统,工作流引擎,表单.
查看>>
jQuery的发展史,你知道吗?
查看>>
JavaWeb:实现文件上传
查看>>
mysql: unknown variable 'character_set_client=UTF8'
查看>>
zabbix3.0监控的配置
查看>>
SSL/TLS部署最佳实践
查看>>
Screen字符桌面共享
查看>>
2015-08-22 linux命令练习3
查看>>
我的hosts文件
查看>>
Google偏爱HTTPS SSL加密链接网站
查看>>
MapReduce作业运行第三方配置文件的共享方法
查看>>
PHP 用户注册
查看>>
26_事务语法
查看>>
Linux常见命令详解1
查看>>
idea:安装配置Git和Github或码云
查看>>
获取各种编码的识别符
查看>>