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 相关文章推荐
javascript基础的动画教程,直观易懂
Jan 10 Javascript
JQuery 小练习(实例代码)
Aug 07 Javascript
JavaScript 浮点数运算 精度问题
Oct 06 Javascript
13 个JavaScript 性能提升技巧分享
Jul 26 Javascript
JS中 用户登录系统的解决办法
Apr 15 Javascript
页面刷新时记住滚动条的位置jquery代码
Jun 17 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
Nov 03 Javascript
了解Javascript的模块化开发
Mar 02 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 Javascript
ES6新特性五:Set与Map的数据结构实例分析
Apr 21 Javascript
js绑定事件和解绑事件
Apr 27 Javascript
有趣的JavaScript隐式类型转换操作实例分析
May 02 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
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
2016/07/05 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
JS正则表达式判断有效数实例代码
2017/03/13 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
React diff算法的实现示例
2018/04/20 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
Python群发邮件实例代码
2014/01/03 Python
python抽取指定url页面的title方法
2018/05/11 Python
python生成九宫格图片
2018/11/19 Python
Python正则表达式和元字符详解
2018/11/29 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
python相对企业语言优势在哪
2020/06/12 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
易程科技软件测试笔试
2013/03/24 面试题
2014年创先争优活动总结
2014/05/04 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技