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选择器 $实现原理
Dec 02 Javascript
JavaScript Event学习补遗 addEventSimple
Feb 11 Javascript
引用外部脚本时script标签关闭的写法
Jan 20 Javascript
JavaScript eval() 函数介绍及应用示例
Jul 29 Javascript
js多功能分页组件layPage使用方法详解
May 19 Javascript
JS实现控制文本框的内容
Jul 10 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
Dec 23 Javascript
js中new一个对象的过程
Feb 20 Javascript
微信小程序 登录的简单实现
Apr 19 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 Javascript
基于jstree使用AJAX请求获取数据形成树
Aug 29 Javascript
es6函数之箭头函数用法实例详解
Apr 25 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中call_user_func_array()函数的用法演示
2012/02/05 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
php include类文件超时问题处理
2015/02/06 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
Prototype 学习 Prototype对象
2009/07/12 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
python 文件与目录操作
2008/12/24 Python
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
python使用fileinput模块实现逐行读取文件的方法
2015/04/29 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
python爬取youtube视频的示例代码
2021/03/03 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
房地产公司见习自我鉴定
2014/04/28 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
自主招生专家推荐信
2015/03/26 职场文书
交通事故起诉书
2015/05/19 职场文书
地道战观后感500字
2015/06/04 职场文书
国庆节主题班会
2015/08/15 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript
Python基于百度API识别并提取图片中文字
2021/06/27 Python