Vue 实现一个命令式弹窗组件功能


Posted in Javascript onSeptember 25, 2019

前言

在日常工作中弹窗组件是很常用的组件,但用得多还是别人的,空闲时间就自己来简单实现一个弹窗组件

涉及知识点:extend、$mount、$el

使用方式:

this.$Confirm({
 title:'自定义标题'
}).then(res=>{
  console.log(res)
})

目录结构

Vue 实现一个命令式弹窗组件功能

index.vue:组件布局、样式、交互逻辑

index.js:挂载组件、暴露方法

知识点

在此之前,了解下涉及的知识点

1. extend

Vue 实现一个命令式弹窗组件功能

 使用这个api,可以将引入的vue组件变成vue构造函数,实例化后方便进行扩展

2. $mount

Vue 实现一个命令式弹窗组件功能

我们希望弹窗组件是在使用时才显示出来,那么就需要动态的向body中添加元素。使用$mount方法可以手动挂载一个vue实例,和 extend 刚好搭配使用,这个也是弹窗组件命令式的关键。

3. $el

Vue 实现一个命令式弹窗组件功能

 既然要添加dom元素,通过实例的$el属性,正好可以取到dom元素,之后就是使用原生方法进行添加节点啦~

代码实现

index.vue

<template>
  <div class="wrap">
    <div class="main">
      <div class="content">
        {{title}}
      </div>
      <div class="btn-grounp">
        <div class="btn cancel" @click="cancel">{{cancelText}}</div>
        <div class="btn confirm" @click="confirm">{{confirmText}}</div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name:'',
  data () {
    return {
      title:'这是一个弹窗',
      confirmText:'确定',
      cancelText:'取消'
    };
  },
  methods: {
    show(cb){
      typeof cb === 'function' && cb.call(this,this)
      return new Promise(resolve=>{
        this.resolve = resolve
      })
    },
    confirm(){
      this.resolve('confirm')
      this.hide()
    },
    cancel(){
      this.resolve('cancel')
      this.hide()
    },
    hide(){
      document.body.removeChild(this.$el)
      this.$destroy()
    }
  },
}

</script>
<style scoped>
.wrap{
  position: fixed;
  top: 0;
  bottom:0;
  left:0;
  right:0;
  display:flex;
  justify-content: center;
  align-items: center;
  background: rgba(0,0,0,.3);
}
.main{
  width: 30%;
  padding: 10px;
  background: #fff;
  box-shadow: 0 0 10px 1px #ddd;
  border-radius: 5px;
}
.content{
  color:#424242;
  font-size: 20px;
}
.btn-grounp{
  margin-top: 15px;
  display:flex;
  justify-content: flex-end;
}
.btn{
  margin-left: 15px;
  padding: 5px 20px;
  border-radius: 5px;
  font-size: 16px;
  color:#fff;
}
.confirm{
  background: lightblue;
}
.cancel{
  background: lightcoral;
}
</style>

index.js

import Vue from 'vue'
import comfirm from './index.vue'
let newInstance = null
//将vue组件变为构造函数
let ConfirmConstructor = Vue.extend(comfirm)
let init = (options)=>{
  //实例化组件
  newInstance = new ConfirmConstructor()
  //合并配置选项
  Object.assign(newInstance,options)
  //加载dom
  document.body.appendChild(newInstance.$el)
}
let caller = (options)=>{
  //options 为调用组件方法时传入的配置选项
  if(!newInstance){
    init(options)
  }
  return newInstance.show(vm =>{newInstance = null})
}
export default {
  install(vue){
    vue.prototype.$Confirm = caller
  }
}

main.js

上面我对外暴露的对象中含有install方法,这里可以使用Vue.use注册组件(使用Vue.use后,会查找install方法进行调用),将组件调用方法挂载到Vue原型上。

import Confirm from './components/confirm'
Vue.use(Confirm)

写在最后

这个弹窗组件比较简陋,还有很多地方可以完善,等有时间再搞了~

总结

以上所述是小编给大家介绍的Vue 实现一个命令式弹窗组件功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
js 效率组装字符串 StringBuffer
Dec 23 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
Dec 04 Javascript
jquery阻止后续事件只执行第一个事件
Jul 24 Javascript
使用jspdf生成pdf报表
Jul 03 Javascript
jquery实现图片水平滚动效果代码分享
Aug 26 Javascript
学习Angularjs分页指令
Jul 01 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
Nov 24 Javascript
搭建Bootstrap离线文档的方法
Dec 02 Javascript
javascript函数的四种调用模式
Jan 08 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
Jul 13 Javascript
js实现鼠标拖拽缩放div实例代码
Mar 25 Javascript
JavaScript或jQuery 获取option value值方法解析
May 12 jQuery
layui prompt 设置允许空白提交的方法
Sep 24 #Javascript
微信小程序制作扭蛋机代码实例
Sep 24 #Javascript
layer.prompt输入层的例子
Sep 24 #Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
Sep 24 #Javascript
解决layer.prompt无效的问题
Sep 24 #Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
Sep 24 #Javascript
layui-table获得当前行的上/下一行数据的例子
Sep 24 #Javascript
You might like
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
jQuery总体架构的理解分析
2011/03/07 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
js实现漫天星星效果
2017/01/19 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
在vue项目中使用sass语法问题
2019/07/18 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
Python如何发布程序的详细教程
2018/10/09 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
python opencv实现图像边缘检测
2019/04/29 Python
wxpython绘制音频效果
2019/11/18 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
银行员工职业规划范文
2014/01/21 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
个人投资计划书
2014/05/01 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
学雷锋倡议书
2015/01/19 职场文书
2019中小学生安全过暑期倡议书
2019/06/24 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js