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 相关文章推荐
获取DOM对象的几种扩展及简写
Oct 09 Javascript
动态添加js事件实现代码
Mar 12 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
May 14 Javascript
Jquery插件写法笔记整理
Sep 06 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
Jun 06 Javascript
jQuery中insertAfter()方法用法实例
Jan 08 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
Sep 28 Javascript
Javacript中自定义的map.js  的方法
Nov 26 Javascript
vue指令v-html使用过滤器filters功能实例
Oct 25 Javascript
vue实现pdf文档在线预览功能
Nov 26 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 Javascript
js实现上传按钮并显示缩略图小轮子
May 04 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 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
小程序登录态管理的方法示例
2018/11/13 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
Python标准库之sqlite3使用实例
2014/11/25 Python
wxPython中listbox用法实例详解
2015/06/01 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
python默认参数调用方法解析
2020/02/09 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
会计与审计毕业生自荐信范文
2013/12/30 职场文书
大专生找工作自荐书
2014/06/10 职场文书
服务口号大全
2014/06/11 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
python 网络编程要点总结
2021/06/18 Python
Javascript的promise,async和await的区别详解
2022/03/24 Javascript