项目环境

@vue/cli 4.5.8

最终效果

需求分析

显示/隐藏

点击遮罩层能否关闭

宽度和zIndex自定义

标题栏 -显示标题和关闭按钮

主体

底部 -内置取消和确定功能

前置知识

teleport通过其to属性可以把实例插入到对应的body

实现过程

搭建大体的html模版

<template>
<teleport to="body">
<div class="modal">
<div class="modal-mask"></div>
<div class="modal-content">
<div class="modal-header">
<slot name="header"></slot>
</div>
<div class="modal-body">
<slot></slot>
</div>
<div class="modal-footer" v-if="!footerHide">
<slot name="footer">
<button class="modal-button">取消</button>
<button class="modal-button modal-button-primary">确定</button>
</slot>
</div>
<div class="modal-close"></div>
</div>
</div>
</teleport>
</template>
<script lang="ts">
import { defineComponent } from "vue"; export default defineComponent({
name: "Modal",
props: {},
emits: [],
setup() {
return { };
},
});
</script>
<style lang="scss">
</style>

添加props和mehtods和css

<template>
<teleport to="body">
<div class="modal" v-show="modelValue" :style="{ zIndex: zIndex }">
<div class="modal-mask" @click="maskClose"></div>
<div class="modal-content" :style="{ width: width }">
<div class="modal-header">
<slot name="header">{{ title }}</slot>
</div>
<div class="modal-body">
<slot></slot>
</div>
<div class="modal-footer" v-if="!footerHide">
<slot name="footer">
<button class="modal-button" @click="closeModal('cancel')">取消</button>
<button class="modal-button modal-button-primary" @click="sure">确定</button>
</slot>
</div>
<div class="modal-close" @click="closeModal('close')"></div>
</div>
</div>
</teleport>
</template>
<script lang="ts">
import { defineComponent } from "vue"; export default defineComponent({
name: "Modal",
props: {
modelValue: Boolean,
title: String,
footerHide: Boolean,
width: {
type: String,
default: "500px",
},
maskClosable: {
type: Boolean,
default: true,
},
zIndex: {
type: Number,
default: 1000,
},
},
emits: ["ok", "close", "update:modelValue"], // 方便TS推断
setup(props, { emit }) {
const closeModal = (type: string) => {
// 关闭Modal 并触发自定义事件‘close-有参数方便区分点击右上方的关闭按钮还是点击底部的取消’
};
const maskClose = () => {
// 通过点击mask层关闭Modal };
const sure = () => {
// 点击确定按钮关闭Modal并添加自定义事件‘ok’
};
return { closeModal, sure, maskClose };
},
});
</script>
<style lang="scss">
.modal {
position: fixed;
top: 0;
left: 0;
z-index: 1000;
&-mask {
width: 100vw;
height: 100vh;
background-color: rgba($color: #000000, $alpha: 0.4);
}
&-content {
width: 500px;
position: absolute;
top: 8vh;
left: 50%;
margin-left: -250px;
background-color: #fff;
border-radius: 8px;
z-index: 1;
font-size: 14px;
}
&-header {
padding: 12px 16px;
border-bottom: 1px solid #e4e7ed;
}
&-footer {
padding: 12px 16px;
border-top: 1px solid #e4e7ed;
text-align: right;
}
&-body {
padding: 16px;
}
&-close {
position: absolute;
top: 12px;
right: 12px;
width: 16px;
height: 16px;
cursor: pointer;
&::before,
&::after {
content: "";
display: block;
position: absolute;
left: 8px;
top: 0;
width: 1px;
height: 16px;
background-color: #999;
border-radius: 0.5px;
transform: rotate(-45deg);
z-index: -1;
}
&::before {
transform: rotate(45deg);
}
&:hover::before,
&:hover::after {
background-color: #444;
}
}
&-button {
line-height: 1em;
font-size: 14px;
padding: 8px 20px;
border: 1px solid #dcdfe6;
outline: none;
display: inline-block;
border-radius: 4px;
cursor: pointer;
background-color: #fff;
transition: 0.1s;
&:hover {
color: #409eff;
border-color: #c6e2ff;
background-color: #ecf5ff;
}
& + & {
margin-left: 10px;
} &-primary {
background-color: #2d8cf0;
border-color: #2d8cf0;
color: white;
&:hover {
background: #66b1ff;
border-color: #66b1ff;
color: #fff;
}
}
}
}
</style>

添加closeModal, sure, maskClose的具体实现--setup具体的实现

...
setup(props, { emit }) {
const closeModal = (type: string) => {
emit("update:modelValue", false);
emit("close", type);
};
const maskClose = () => {
if (props.maskClosable) closeModal("close");
};
const sure = () => {
emit("update:modelValue", false);
emit("ok");
};
return { closeModal, sure, maskClose };
},
...

完整的代码在github

vue3:modal组件开发的更多相关文章

  1. 移动端 Modal 组件开发杂谈

    Vant 是有赞开发的一套基于 Vue 2.0 的 Mobile 组件库,在开发的过程中也踩了很多坑,今天我们就来聊一聊开发一个移动端 Modal 组件(在有赞该组件被称为 Popup )需要注意的一 ...

  2. 利用bootstrap的modal组件自定义alert,confirm和modal对话框

    由于浏览器提供的alert和confirm框体验不好,而且浏览器没有提供一个标准的以对话框的形式显示自定义HTML的弹框函数,所以很多项目都会自定义对话框组件.本篇文章介绍自己在项目中基于bootst ...

  3. vue前端开发那些事——vue组件开发

    vue的学习曲线不是很陡(相比其它框架,如anglarjs),官方文档比较全面,分为基础篇和高级篇.我们刚开始学习的时候,肯定像引用jquery那样,先把vue的js引进来,然后学习基础内容.如果仅仅 ...

  4. React-Native 组件开发方法

    前言 React Native的开发思路是通过组合各种组件来组织整个App,在大部分情况下通过组合View.Image等几个基础的组件,可以非常方便的实现各种复杂的跨平台组件,不过在需要原生功能支持. ...

  5. 饿了么基于Vue2.0的通用组件开发之路(分享会记录)

    Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库.今天我们要分享的就是开发 Element 的一些心得. 官网 ...

  6. 基于vue的新组件开发

    前天完成了一个新组件的开发,做的过程也是各种遇到问题,彻底弄懂了slot,巩固了一些flex布局和jquery的知识,比起自己第一次做组件开发,现在已经是能够下手做,遇到问题解决问题,还算有进步. 但 ...

  7. winRT Com组件开发流程总结

    winRT Com组件开发: 1.编辑idl文件,winRT COM的idl文件与win32的idl文件有差异,如下: interface ItestWinRTClass; runtimeclass ...

  8. [js开源组件开发]localStorage-cache本地存储的缓存管理

    localStorage-cache本地存储的缓存管理 距离上次的组件开发有近三个月的时间了,最近一直在做一些杂事,无法静下心来写写代码,也是在学习emberjs,在emberjs中有一个很重要的东西 ...

  9. 【2015上半年总结】js开源组件开发系列索引

    js开源组件开发系列一索引 2015.8 by 田想兵 个人网站 从3月份进入新公司以来,时经五个月,我以平均每周1个小组件的速度,已经完成的js组件有22个之余了,已基本上全部用到实际项目中,这些小 ...

  10. [js开源组件开发]network异步请求ajax的扩展

    network异步请求ajax的扩展 在日常的应用中,你可能直接调用$.ajax是会有些问题的,比如说用户的重复点击,比如说我只希望它成功提交一次后就不能再提交,比如说我希望有个正在提交的loadin ...

随机推荐

  1. [IOI2000]邮局 题解

    简要题意 线段上有 \(V\) 个村庄,现在要建 \(P\) 个邮局,使每个村庄到最近的邮局的距离之和最小. 50分做法 设\(dp[i][j]\) 表示第一个村庄到第 \(i\) 个村庄,建了 \( ...

  2. 使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss

    前言 什么是 RSS? RSS 是一种描述和同步网站内容的格式,是使用最广泛的 XML 应用.RSS 搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者.发布一个 RSS 文件后,这个 ...

  3. Python-List内部实现

    Python有很大实现的版本,像拿C语言实现的Cpython,以及在其基础上改进其解释执行变为即时编译(jit)的Pypy,还有一些其他的比如Jpython等.具体来说 其中使用c语言开发的叫做pyt ...

  4. 面向切面编程AOP[二](java @EnableAspectJAutoProxy 代码原理)

    前言 @EnableAspectJAutoProxy 是启动aop功能的意思,那么里面是什么呢? 正文 @Target({ElementType.TYPE}) @Retention(Retention ...

  5. 迁移 Nacos 和 ZooKeeper,有了新工具

    简介: 注册中心迁移在行业中主要有两个方案,一个是双注册双订阅模式(类似数据库双写),一个是 Sync 模式(类似于数据库 DTS):MSE 同时支持了两种模式,对于开通 MSE 服务治理客户,MSE ...

  6. SKG 渠道中台借助 SAE + 大禹打造云原生 DevOPS,提效 60%

    简介: 新零售标杆 SKG 全面拥抱 Serverless,敏捷交付! 作者:陈列昂(SKG).昕辰.龙琛.黛忻 项目背景 未来穿戴健康科技股份有限公司(SKG)是一家专注为个人与家庭提供智能可穿戴健 ...

  7. 云效故障定位研究论文被ICSE 2021 SEIP track收录

    近期,由阿里云云效团队联合复旦大学CodeWisdom研究团队.阿里技术风险部安全生产团队,合作完成的论文<MicroHECL: High-Efficient Root Cause Locali ...

  8. Dubbo 跨语言调用神兽:dubbo-go-pixiu

    简介: Pixiu 是基于 Dubbogo 的云原生.高性能.可扩展的微服务 API 网关.作为一款网关产品,Pixiu 帮助用户轻松创建.发布.维护.监控和保护任意规模的 API ,接受和处理成千上 ...

  9. 什么是 IDA 工具

    中文名:交互式反编译器 英文名:Interactive Disassembler Professional 为众多 0day 世界的成员和 ShellCode 安全分析人士不可缺少的利器! IDA P ...

  10. [Gin] 路由分组 Group 的内部实现 与 块空间 { } 的应用

    通过这篇 [Gin] 单文件极简 HTTP Server 流程分析 ( gin-gonic/gin ) 我们知道了 gin.go 中的 Engine 继承有 routergroup.go 中的 Rou ...