vue做移动端经常碰到弹窗的需求, 这里写一个功能简单的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>

插件化

组件功能写好了,但是这种调用方式显得很累赘。举个例子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>

来源:https://segmentfault.com/a/1190000016313195

vue弹窗插件实战的更多相关文章

  1. layer弹窗插件实战用法小结1—— layer.alert()

    http://layer.layui.com 第一节:layer.alert()弹窗的用法 1.解压layer-v2.2.zip压缩包 2.拷贝layer文件夹到实战项目目录 3.注意:layer.j ...

  2. vue.js及项目实战[笔记]— 03 vue.js插件

    一. vue补充 1. 获取DOM元素 救命稻草,document.querySelector 在template中标示元素`ref = "xxx" 在要获取的时候,this.$r ...

  3. ThinkPHP5+Apicloud+vue商城APP实战

    ThinkPHP5+Apicoud+vue商城APP实战 目录 章节1:项目概述 课时1apicloud平台介绍.04:38 课时2知识体系架构介绍.16:10 章节2:apicloud50分钟快速入 ...

  4. vue各种插件汇总

    https://blog.csdn.net/wh8_2011/article/details/80497620(copy) Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一 ...

  5. 【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖游戏总结

    大家好!先上图看看本次案例的整体效果. 完整版实战课程附源码:[Vue.js游戏机实战]- Vue.js实现九宫格水果机抽奖 实现思路: Vue component实现九宫格水果机组件,可以嵌套到任意 ...

  6. 【Vue.js游戏机实战】- Vue.js实现老虎-机抽奖总结

    大家好!先上图看看本次案例的整体效果. 完整版实战课程附源码:[Vue.js游戏机实战]- Vue.js实现老虎-机抽奖 实现思路: Vue component实现老虎-机组件,可以嵌套到任意要使用的 ...

  7. vue 常用插件,保存

    UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 mint-ui- Vue 2的移动UI元素 iview- 基于 Vuejs 的开源 UI ...

  8. vue+uni-app商城实战 | 第一篇:【有来小店】微信小程序快速开发接入Spring Cloud OAuth2认证中心完成授权登录

    一. 前言 本篇通过实战来讲述如何使用uni-app快速进行商城微信小程序的开发以及小程序如何接入后台Spring Cloud微服务. 有来商城 youlai-mall 项目是一套全栈商城系统,技术栈 ...

  9. vue自定义插件封装,实现简易的elementUi的Message和MessageBox

    vue自定义插件封装示例 1.实现message插件封装(类似简易版的elementUi的message) message组件 <template>     <transition  ...

随机推荐

  1. P2085 最小函数值 (堆)

    题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix^2+Bix+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). ...

  2. POJ 2002 Squares [hash]

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 16631   Accepted: 6328 Descript ...

  3. Java学习:一 开篇

    呃 工作中要用到Android开发,呃 不巧的是,关于Java关于Android,当初也只是浅浅的了解了一下.....真是书到用时方恨少了.. 趁现在工作不是太忙,还是花点时间来学习一下吧. 写写博客 ...

  4. MongoDB 复制(副本集)学习

    MongoDB 复制(副本集)学习 replication set复制集,复制集,多台服务器维护相同的数据副本,提高服务器的可用性.MongoDB复制是将数据同步在多个服务器的过程.复制提供了数据的冗 ...

  5. Spring Batch 文档(中文)

    http://blog.csdn.net/shorn/article/category/1186181

  6. Day 3 网络基础

    网络基础 一.什么是互联网协议及为何要有互联网协议 ? 互联网协议:指的就是一系列统一的标准,这些标准称之为互联网协议.互联网的本质就是一系列的协议,总称为‘互联网协议’(Internet Proto ...

  7. CentOS 7.5 初始网络配置

    最近刚装完 CentOS 7.5 系统,由于网络不通,导致无法用 yum 命令下载软件,经过了各种折腾,终于搞定了,这里讲解一下 如何设置初始网络. 本案例环境  VmWare 11.0 , 操作系统 ...

  8. IIS Express 的怪毛病 vs2013本机调试

    本机调试时,如果同一个项目有多个版本,同时debug,可能会串项目调试,造成不必要的困扰: 通常情况下是 IIS express的映射出现了问题: 解决方案: 1.打开目录:查看文件C:\Users\ ...

  9. java cocurrent并发包

    1. java.util.concurrent - Java 并发工具包Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Jav ...

  10. 用户空间&内核空间学习 & top命令 & time命令

    参考了这篇文章 http://www.ruanyifeng.com/blog/2016/12/user_space_vs_kernel_space.html 简单说,Kernel space 是 Li ...