资讯专栏INFORMATION COLUMN

vue弹窗插件实战

ZweiZhao / 2967人阅读

摘要:组件显示隐藏由内部属性控制,只暴露给外界和个方法,个方法触发对应的事件测试一下弹窗内容插件化组件功能写好了,但是这种调用方式显得很累赘。我们写的弹窗能不能这么方便呢,为此需要把改写成插件。

vue做移动端经常碰到弹窗的需求, 这里写一个功能简单的vue弹窗

popup.vue

组件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个方法触发对应的事件

测试一下


插件化

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

let $vm

const libs = {
  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()
    $vm.$off("show")
    $vm.$off("hide")
  },
  //只配置文字
  text(text) {
    this.open({ text })
  }
}

export default {
  install(Vue) {
    $vm = factory(Vue)
    Vue.prototype.$popup = libs
  }
}

export {
  libs as Popup
}

在main.js内注册插件

//main.js
import Vue from "vue"
import PopupPlugin from "@/plugins/popupPlugin"

Vue.use(PopupPlugin)

在vue框架内调用就非常方便了

======================================================================
大半年后更新, 之前此插件只能在Vue组件内使用, 受到element ui, 添加一句 export { libs as Popup }. 这样可以在任何js内调用弹窗

import { Popup } from "@/plugins/popupPlugin"

Popup.open("弹窗消息")

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97550.html

相关文章

  • Vue $mount实战--实现消息弹窗组件

    摘要:之前的项目一直在使用框架,中的组件使用时不需要在写标签,而是使用调用。这样在组件中就可以通过的形式来使用了参考参考了的代码封装组件的一些技巧 之前的项目一直在使用Element-UI框架,element中的Notification、Message组件使用时不需要在html写标签,而是使用js调用。那时就很疑惑,为什么element ui使用this.$notify、this.$mess...

    lvzishen 评论0 收藏0
  • vue插件开发练习--实用弹窗

    摘要:前言上回说了组件组件开发练习焦点图切换的一个练习项目,这次换下口味,说下的插件练手的项目。和组件开发的目录相比,区别就在于这个文件夹上。开发过程把项目跑起来首先,先弄这个组件。最后还需要一个变量,控制弹窗是否显示。 1.前言 上回说了组件(vue组件开发练习--焦点图切换)的一个练习项目,这次换下口味,说下vue的插件练手的项目。相对于现在之前的焦点图切换的组件,这个可能就更简单了,基...

    muzhuyu 评论0 收藏0
  • 2017-06-28 前端日报

    摘要:前端日报精选我是如何实现的在线升级热更新功能的张鑫旭鑫空间鑫生活翻译表单的运用第期晋升评审的套路异步编程的四种方式黄博客精选组件设计和分解思考掘金中文译使登录页面变得正确掘金前端从强制开启压缩探究插件运行机制掘金个常用的简 2017-06-28 前端日报 精选 我是如何实现electron的在线升级热更新功能的? « 张鑫旭-鑫空间-鑫生活【翻译】React 表单: Refs 的运用【...

    QLQ 评论0 收藏0
  • 手把手教你撸个vue2.0弹窗组件

    摘要:组件结构同组件结构通过方法获取元素的大小及其相对于视口的位置,之后对提示信息进行定位。可以用来进行一些复杂带校验的弹窗信息展示,也可以只用于简单信息的展示。可以通过属性来显示任意标题,通过属性来修改显示区域的宽度。 手把手教你撸个vue2.0弹窗组件 在开始之前需要了解一下开发vue插件的前置知识,推荐先看一下vue官网的插件介绍 预览地址 http://haogewudi.me/k...

    mrli2016 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<