vue弹窗插件实战代码


Posted in Javascript onSeptember 08, 2018

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>

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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery的试卷自动排版系统实现代码
Jan 06 Javascript
仿猪八戒网左下角的文字滚动效果
Oct 28 Javascript
document.getElementById获取控件对象为空的解决方法
Nov 20 Javascript
jQuery实现点击该行即可删除HTML表格行
Oct 17 Javascript
详细解读AngularJS中的表单验证编程
Jun 19 Javascript
原生js实现class的添加和删除简单代码
Jul 12 Javascript
JavaScript数值千分位格式化的两种简单实现方法
Aug 01 Javascript
Vue.js事件处理器与表单控件绑定详解
Mar 20 Javascript
Node.js  REPL (交互式解释器)实例详解
Aug 06 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
Aug 09 Javascript
Vuex的actions属性的具体使用
Apr 14 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
Apr 22 Javascript
浅谈从React渲染流程分析Diff算法
Sep 08 #Javascript
详解Webpack-dev-server的proxy用法
Sep 08 #Javascript
详解Ubuntu安装angular-cli遇到的坑
Sep 08 #Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
Sep 07 #Javascript
Bootstrap-table使用footerFormatter做统计列功能
Sep 07 #Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 #jQuery
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 #Javascript
You might like
图书管理程序(一)
2006/10/09 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
Python中为什么要用self探讨
2015/04/14 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
python实现给数组按片赋值的方法
2015/07/28 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
python生成1行四列全2矩阵的方法
2018/08/04 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
python Cartopy的基础使用详解
2020/11/01 Python
python中的时区问题
2021/01/14 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
法国体育用品商店:GO Sport
2019/10/23 全球购物
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
迎新晚会邀请函
2014/02/01 职场文书
预备党员承诺书
2014/03/25 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
投资申请报告
2015/05/19 职场文书
P站美图推荐——变身女主角特辑
2022/03/20 日漫
SQL Server 中的事务介绍
2022/05/20 SQL Server