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不能跳转到上一页面的问题解决方法
Mar 01 Javascript
js判断输入是否为数字的具体实例
Aug 03 Javascript
关于JavaScript 原型链的一点个人理解
Jul 31 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
Aug 23 Javascript
浅析Vue中method与computed的区别
Mar 06 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
May 02 Javascript
angularjs结合html5实现拖拽功能
Jun 25 Javascript
JS使用cookie保存用户登录信息操作示例
May 30 Javascript
对Layer UI 模块化的用法详解
Sep 26 Javascript
JS回调函数简单易懂的入门实例分析
Sep 29 Javascript
jQuery实现雪花飘落效果
Aug 02 jQuery
vue自定义树状结构图的实现方法
Oct 18 Javascript
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 5.4 你必须要知道的
2013/08/07 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
动态添加删除表格行的js实现代码
2014/02/28 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
Python书单 不将就
2017/07/11 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
Python 实现微信自动回复的方法
2020/09/11 Python
授权委托书范本
2014/04/03 职场文书
小学毕业演讲稿
2014/04/25 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
2015大学生实训报告
2014/11/05 职场文书
解除同居协议书
2015/01/29 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android