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 相关文章推荐
不一样的文字闪烁 轮番闪烁
Nov 11 Javascript
javascript jq 弹出层实例
Aug 25 Javascript
让复选框只能选择一项的方法
Oct 08 Javascript
jquery三个关闭弹出层的小示例
Nov 05 Javascript
js跑步算法的实现代码
Dec 04 Javascript
Node.js实现简单聊天服务器
Jun 20 Javascript
express的中间件bodyParser详解
Dec 04 Javascript
深入理解JavaScript单体内置对象
Jun 06 Javascript
Google 地图API Map()构造器详解
Aug 06 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
Nov 21 Javascript
微信小程序实战之自定义toast(6)
Apr 18 Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 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
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
PHP中使用CURL获取页面title例子
2015/01/07 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
JS基于Mootools实现的个性菜单效果代码
2015/10/21 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
Django中的文件的上传的几种方式
2018/07/23 Python
对Django url的几种使用方式详解
2019/08/06 Python
python中树与树的表示知识点总结
2019/09/14 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
python Tornado框架的使用示例
2020/10/19 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
计划生育标语
2014/06/23 职场文书
企业委托书范本
2014/09/13 职场文书
工作经验交流材料
2014/12/30 职场文书
离职信范本
2015/06/23 职场文书
vue router 动态路由清除方式
2022/05/25 Vue.js
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS