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 相关文章推荐
动态刷新 dorado树的js代码
Jun 12 Javascript
jquery $.ajax各个事件执行顺序
Oct 15 Javascript
再谈querySelector和querySelectorAll的区别与联系
Apr 20 Javascript
js 距离某一时间点时间是多少实现代码
Oct 14 Javascript
使用requestAnimationFrame实现js动画性能好
Aug 06 Javascript
jQuery实现放大镜效果实例代码
Mar 17 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
Jun 07 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
Sep 21 Javascript
Vue在页面数据渲染完成之后的调用方法
Sep 11 Javascript
Vue axios获取token临时令牌封装案例
Sep 11 Javascript
一篇文章了解正则表达式的替换技巧
Feb 24 Javascript
前端框架ECharts dataset对数据可视化的高级管理
Dec 24 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生成短网址示例
2014/05/05 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
php中如何执行linux命令详解
2018/11/06 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
Python实现曲线点抽稀算法的示例
2017/10/12 Python
Python内置模块logging用法实例分析
2018/02/12 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
详解python的argpare和click模块小结
2019/03/31 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
食品安全检查制度
2014/02/03 职场文书
写求职信有什么意义
2014/02/17 职场文书
2014村务公开实施方案
2014/02/25 职场文书
初中班主任寄语
2014/04/04 职场文书
师德师风自我评价范文
2014/09/11 职场文书
坎儿井导游词
2015/02/09 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js