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 相关文章推荐
msn上的tab功能Firefox对childNodes处理的一个BUG
Jan 21 Javascript
javascript 防止刷新,后退,关闭
Aug 07 Javascript
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
Javascript的时间戳和php的时间戳转换注意事项
Apr 12 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
DOM 高级编程
May 06 Javascript
如何实现移动端浏览器不显示 pc 端的广告
Oct 15 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
Aug 01 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
Nov 30 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
Dec 13 Javascript
Vue之Watcher源码解析(2)
Jul 19 Javascript
理解JavaScript中的对象
Aug 25 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
基于mysql的bbs设计(四)
2006/10/09 PHP
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
详解async/await 异步应用的常用场景
2019/05/13 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
python实现图片变亮或者变暗的方法
2015/06/01 Python
python开发中module模块用法实例分析
2015/11/12 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
对python3新增的byte类型详解
2018/12/04 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
护士演讲稿优秀范文
2014/04/30 职场文书
商业门面租房协议书
2014/11/25 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
酒店员工手册范本
2015/05/14 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书