前言

一直都想写一个组件库,作为一个前端的我一直都有这么一个梦想,在写项目的过程中一直都在引用别人的组件库长久而言自己也开始想写一个组件库。什么是组件呢?这里不再过的赘述,下面我们先谈一谈confirm组件的封装过程。在有些平台使用过程中删除操作常常伴随着确认的情况毕竟要避免客户的误操作么,废话不多说开怼!!!

第一个了解一些前置的API

Vue.extend方法

这是vue的官方文档可能看到了有点蒙蔽,extend创建的是一个组件构造器,而不是一个具体的组件实例。通常是配合组件使用的,因为我们最终需要使用this.$confirm的方式进行调用。那么我们需要这个方法来构造一个组件。 如何全局引入组件

const components = {ConfirmModal
}
const install = function (Vue) {if (install.installed) returnObject.keys(components).forEach(key => {Vue.component(components[key].name, components[key])})Vue.prototype.$confirm=ConfirmModal
}if (typeof window !== 'undefined' && window.Vue) {install(window.Vue)
}const API = {install,...components
}
复制代码

上面的代码里面components代表数组对象我们同过Object.keys的方式使用Vue.component语法将组件注册。上面有一行将confirm的方法调用这个组件了。

开始写组件

组件代码如下:

<template><div class="alertModal"><!--social post弹框--><transition name="fade"><div class="alertbox"><div class="alert-dialog"><div class="alert-content"><div class="alert-header"><span class="alertclose" @click="close">×</span><span class="alert-title">{{modelTitle}}</span></div><div class="alert-body">{{modelContent}}</div><div class="alert-footer"><button class="alertbtn" @click="close">{{modelClose}}</button><button class="alertbtn alert-info" @click="confirm">{{modelSave}}</button></div></div></div></div></transition><div class="modal-backdrop"></div></div>
</template><script>
import confirmMixin from'./confirmMixin.js'
export default {mixins:[confirmMixin],props: {modelTitle: {type: String,default: "确认框" },modelSave: {type: String,default: "确认"},modelClose: {type: String,default: "取消"},modelContent: {type: String,default: "我是确认框"},callBack: {type: Function,default() {}},closeAction: {type: Function,default() {}}},methods: {close() {this.$emit("close");this.isVisible = false;this.closeAction();this.destroyed();},//点击确定按钮弹窗消失confirm() {this.$emit("confirm");this.isVisible = false;this.callBack();this.destroyed();},destroyed() {setTimeout(() => {this.$destroy();}, 200);}},mounted() {setTimeout(() => {this.isVisible = true;}, 100);}
};
</script>
<style  scoped>
.modal.fade .alert-dialog {-webkit-transition: -webkit-transform 0.3s ease-out;-o-transition: -o-transform 0.3s ease-out;transition: transform 0.3s ease-out;-webkit-transform: translate(0, -25%);-ms-transform: translate(0, -25%);-o-transform: translate(0, -25%);transform: translate(0, -25%);
}
.modal.in .alert-dialog {-webkit-transform: translate(0, 0);-ms-transform: translate(0, 0);-o-transform: translate(0, 0);transform: translate(0, 0);
}
.alertbox {position: fixed;top: 0;bottom: 0;left: 0;right: 0;text-align: center;z-index: 99999;
}
.alert-dialog {display: inline-block;width: 420px;padding-bottom: 10px;vertical-align: middle;background-color: #fff;border-radius: 4px;border: 1px solid #e6ebf5;font-size: 18px;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);text-align: left;overflow: hidden;backface-visibility: hidden;position: relative;top: 140px;padding: 10px 15px;
}
.modal-backdrop.fade {filter: alpha(opacity=0);opacity: 0;
}
.modal-backdrop.in {filter: alpha(opacity=50);opacity: 0.5;
}
.alert-footer {float: right;margin-top: 5px;
}
.alert-scrollbar-measure {position: absolute;top: -9999px;width: 50px;height: 50px;overflow: scroll;
}.fade-enter-active,
.fade-leave-active {transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to /* .fade-leave-active in <2.1.8 */ {opacity: 0;
}
.modal-backdrop {position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 1040;background-color: #000;opacity: 0.5;
}.el-icon-date {cursor: pointer;
}
.alert-header {
}
.alert-title {font-size: 18px;line-height: 1;color: #2d2f33;
}
.alert-body {padding: 10px 0px;color: #5a5e66;font-size: 14px;line-height: 17px;
}
.alertbtn {text-align: center;font-weight: 500;cursor: pointer;padding: 9px 15px;font-size: 12px;border-radius: 3px;line-height: 1;background: #fff;border: 1px solid #d8dce5;border-color: #d8dce5;color: #5a5e66;
}
.alert-info {color: #fff;background-color: #409eff;border-color: #409eff;
}
.alertclose {float: right;cursor: pointer;
}
</style>
复制代码

可以看到里面使用了mixin的语法我把有些公共的逻辑抽离了出来万一能复用呢?

const ConfirmMixin = {props: {isVisible: {type: Boolean,default: false}},data () {return {isActive: false}},methods: {active () {this.isActive = true},close () {this.$emit('close')this.isActive = false}},watch: {isVisible (val) {this.isActive = val}},mounted () {this.$nextTick(() => {document.body.appendChild(this.$el)if (this.isVisible) {this.active()}})},beforeDestroy () {this.$el.remove()}}export default ConfirmMixin;
复制代码

这个就是mixin的代码

最后写一个入口文件 index.JS文件这个文件非常关键将会使用上面我们说到的API创建组建的构造器 然后实例化组件并返回一个方法。

import Vue from 'vue'
import confirm from './confirm.vue'function open(propsData) {const confirmComponent = Vue.extend(confirm);return new confirmComponent({el: document.createElement('div'),propsData})
}
export default {confirm(opts) {const defaultOpts={ modelTitle: "确认框",modelSave:  "确认",modelClose: "取消",modelContent:  "我是确认框",callBack() {},closeAction() {}}const propsOpts=Object.assign(defaultOpts,opts);return open(propsOpts)}
}
复制代码

这就是index.js的主要逻辑,我们构造过一个组件之后,就可以使用vnode里面的一些属性,我们可以通过这个属性吧组件需要的值传递过去。列入这里面的props和el元素。最后写一个confirm的方法并返回这个方法,方法里面主要是一些默认配置,当没有内容合并进去的时候就会展示这个默认值。

如何使用

我们如何这个组件呢?

this.$confirm.confirm({modelTitle: "确认框",modelSave:  "确认",modelClose: "取消",modelContent:  "我是确认框",callBack() {alert(1111)},closeAction() {alert(222)}})
复制代码

最后的效果

写在最后

哈哈最后写一个组件也是挺费劲的得想到各种情况,各种回调函数如何调用。一个小小的组件多么的考验js的功底,撒花完成。

转载于:https://juejin.im/post/5cb9860551882532801c851b

如何写出一个confirm组件相关推荐

  1. 怎样写出一个较好的高速排序程序

    写出一个较好的高速排序程序 高速排序是经常使用的排序算法之中的一个,但要想写出一个又快又准的使用程序,就不是那么简单了 须要注意的事项 首先要写正确.通常使用递归实现.其递归相当于二叉树展开,因此假设 ...

  2. linux mysql 不稳定_linux,mysql:今天写出一个十分弱智的bug!

    今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~ 在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫: select record.a, y.c ...

  3. 写出一个缓存系统的伪代码001

    /*** 写出一个缓存系统的伪代码*/ public class CacheDemo {private Map<String, Object> map = new HashMap<S ...

  4. 给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)

    给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出.要求除该树本树的存储空间外只能使用固定量的额外存储空间,且过程中不得修改该树,即使是暂时的修改也不允许. (算法导 ...

  5. 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)

    给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...

  6. 给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出(算法导论第十章10.4-2)

    给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出 (算法导论第十章10.4-2) #include <iostream> template<typena ...

  7. [vue] 写出多种定义组件模板的方法

    [vue] 写出多种定义组件模板的方法 1.字符串 2.模板字面量 3.<script type="x-template"></script> 4.文件组件 ...

  8. 如何写出一个较好的快速排序程序

    写出一个较好的快速排序程序 快速排序是常用的排序算法之一,但要想写出一个又快又准的使用程序,就不是那么简单了 需要注意的事项 首先要写正确.通常使用递归实现.其递归相当于二叉树展开,因此如果要用迭代实 ...

  9. @bean 什么时候执行_写好一个Spring组件的实现步骤是什么?

    这篇文章主要介绍了如何写好一个Spring组件的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,希望可以帮助到大家! 本文详细的介绍了Spring组件的实现步骤, ...

最新文章

  1. caffe-cuda测试
  2. nginx启动报错:Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' fo
  3. 图灵71年前提出神经网络!《智能机器》再掀热议,却一生未发表
  4. 初识vue+elementUi
  5. 【Codeforces - 900C】Remove Extra One(思维,STLset,tricks)
  6. 新博开通,近期将推出系列博客之测试工具篇!
  7. bash不能运行c语言,解决:无法加载文件 C:\\Program Files\\.. 因为在此系统上禁止运行脚本。...
  8. c# opencv车牌识别_牛逼plus的springboot+maven车牌识别开源系统
  9. 西门子S7-300PLC采用博途V14编程程序,附带博途WINCC上位机,项目内容甲醛生产线项目,模拟量处理,电机控制等
  10. Greasy Fork 视频网页全屏脚本
  11. 基于微信评选投票小程序系统设计与实现 开题报告
  12. 金项奖入围展播 | 梦系来客,星耀有礼
  13. 在Mac上使用idea搭建flink java开发环境
  14. 小米大佬分享8年工控上位机工作经历
  15. pool win10提示bad_Win10怎么修复出现bad pool header蓝屏的情况?
  16. 【python核心编程笔记+习题】-CH7-映射
  17. 3COM 交换机端口的监听配置 ZT
  18. 忆阻器的matlab建模_【基于忆阻器的基本滤波电路的Pspice仿真研究】 忆阻器matlab仿真仿什么呢...
  19. Abp Core添加手机登录功能
  20. MySQL part2

热门文章

  1. ribbon设置url级别的超时时间
  2. Apache Storm 官方文档 —— 消息的可靠性保障
  3. Linux学习之获取帮助
  4. 做个md5查询站(2)初步设计
  5. JavaScript常用代码
  6. 《Python和Pygame游戏开发指南》——1.12 图书中的文本折行
  7. iOS - UnitTests 单元测试
  8. 常用oracle数据库函数总结
  9. Linux主机被黑过程和简单处理
  10. phpc.sinaapp.com 加密的解密方法