vue弹窗插件实战
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弹窗插件实战的更多相关文章
- layer弹窗插件实战用法小结1—— layer.alert()
http://layer.layui.com 第一节:layer.alert()弹窗的用法 1.解压layer-v2.2.zip压缩包 2.拷贝layer文件夹到实战项目目录 3.注意:layer.j ...
- vue.js及项目实战[笔记]— 03 vue.js插件
一. vue补充 1. 获取DOM元素 救命稻草,document.querySelector 在template中标示元素`ref = "xxx" 在要获取的时候,this.$r ...
- ThinkPHP5+Apicloud+vue商城APP实战
ThinkPHP5+Apicoud+vue商城APP实战 目录 章节1:项目概述 课时1apicloud平台介绍.04:38 课时2知识体系架构介绍.16:10 章节2:apicloud50分钟快速入 ...
- vue各种插件汇总
https://blog.csdn.net/wh8_2011/article/details/80497620(copy) Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一 ...
- 【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖游戏总结
大家好!先上图看看本次案例的整体效果. 完整版实战课程附源码:[Vue.js游戏机实战]- Vue.js实现九宫格水果机抽奖 实现思路: Vue component实现九宫格水果机组件,可以嵌套到任意 ...
- 【Vue.js游戏机实战】- Vue.js实现老虎-机抽奖总结
大家好!先上图看看本次案例的整体效果. 完整版实战课程附源码:[Vue.js游戏机实战]- Vue.js实现老虎-机抽奖 实现思路: Vue component实现老虎-机组件,可以嵌套到任意要使用的 ...
- vue 常用插件,保存
UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 mint-ui- Vue 2的移动UI元素 iview- 基于 Vuejs 的开源 UI ...
- vue+uni-app商城实战 | 第一篇:【有来小店】微信小程序快速开发接入Spring Cloud OAuth2认证中心完成授权登录
一. 前言 本篇通过实战来讲述如何使用uni-app快速进行商城微信小程序的开发以及小程序如何接入后台Spring Cloud微服务. 有来商城 youlai-mall 项目是一套全栈商城系统,技术栈 ...
- vue自定义插件封装,实现简易的elementUi的Message和MessageBox
vue自定义插件封装示例 1.实现message插件封装(类似简易版的elementUi的message) message组件 <template> <transition ...
随机推荐
- 623. Add One Row to Tree
Problem statement Given the root of a binary tree, then value v and depth d, you need to add a row o ...
- C 语言中的 feof()函数
功能: feof 是 C 语言标准库函数函数,其原型在 stdio.h 中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被 clearerr() 清除. 用法: ...
- javaScriptCore 实战与小结
源码在这,看不懂的直接撸源码就行,转载声明出处 原生调用JS的大致流程,做了个思维简图 这是代码流程 // JS数据 func getJSVar() { let context: JSContex ...
- Bichrome Tree
Bichrome Tree 时间限制: 1 Sec 内存限制: 128 MB 题目描述 We have a tree with N vertices. Vertex 1 is the root of ...
- HTML中字体单位px pt em之间的转换
在实现打印功能时,遇到一个问题,使用px作为单位在不同的机器或者打印机上打印出的字体大小不一样,所以经过查询,发现使用pt为单位能够进行物流适配,下面是各单位之间的转换: 定义字体大小有常见三种单位, ...
- Ajax 实现文件的下载
JQuery的ajax函数的返回类型只有xml.text.json.html等类型,没有“流”类型,所以我们要实现ajax下载,不能够使用相应的ajax函数进行文件下载.但可以用js生成一个form, ...
- hadoop+yarn+hbase+storm+kafka+spark+zookeeper)高可用集群详细配置
配置 hadoop+yarn+hbase+storm+kafka+spark+zookeeper 高可用集群,同时安装相关组建:JDK,MySQL,Hive,Flume 文章目录 环境介绍 节点介绍 ...
- __new__ 和 __init__
new 在新式类中负责真正的实例化对象,而__init__只是负责初始化 __new__创建的对象.一般来说 new 创建一个内存对象,也就是实例化的对象的实体,交给__init__进行进一步加工.官 ...
- javascript 复制粘贴操作
function CopyCode(key){ var trElements = document.all.tags("tr");//获取tr元素 var i; for(i = 0 ...
- C#json数据的序列化和反序列化(将数据转换为对象或对象集合)
引用 System.Runtime.Serialization.Json