vue3:modal组件开发
项目环境
@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组件开发的更多相关文章
- 移动端 Modal 组件开发杂谈
Vant 是有赞开发的一套基于 Vue 2.0 的 Mobile 组件库,在开发的过程中也踩了很多坑,今天我们就来聊一聊开发一个移动端 Modal 组件(在有赞该组件被称为 Popup )需要注意的一 ...
- 利用bootstrap的modal组件自定义alert,confirm和modal对话框
由于浏览器提供的alert和confirm框体验不好,而且浏览器没有提供一个标准的以对话框的形式显示自定义HTML的弹框函数,所以很多项目都会自定义对话框组件.本篇文章介绍自己在项目中基于bootst ...
- vue前端开发那些事——vue组件开发
vue的学习曲线不是很陡(相比其它框架,如anglarjs),官方文档比较全面,分为基础篇和高级篇.我们刚开始学习的时候,肯定像引用jquery那样,先把vue的js引进来,然后学习基础内容.如果仅仅 ...
- React-Native 组件开发方法
前言 React Native的开发思路是通过组合各种组件来组织整个App,在大部分情况下通过组合View.Image等几个基础的组件,可以非常方便的实现各种复杂的跨平台组件,不过在需要原生功能支持. ...
- 饿了么基于Vue2.0的通用组件开发之路(分享会记录)
Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库.今天我们要分享的就是开发 Element 的一些心得. 官网 ...
- 基于vue的新组件开发
前天完成了一个新组件的开发,做的过程也是各种遇到问题,彻底弄懂了slot,巩固了一些flex布局和jquery的知识,比起自己第一次做组件开发,现在已经是能够下手做,遇到问题解决问题,还算有进步. 但 ...
- winRT Com组件开发流程总结
winRT Com组件开发: 1.编辑idl文件,winRT COM的idl文件与win32的idl文件有差异,如下: interface ItestWinRTClass; runtimeclass ...
- [js开源组件开发]localStorage-cache本地存储的缓存管理
localStorage-cache本地存储的缓存管理 距离上次的组件开发有近三个月的时间了,最近一直在做一些杂事,无法静下心来写写代码,也是在学习emberjs,在emberjs中有一个很重要的东西 ...
- 【2015上半年总结】js开源组件开发系列索引
js开源组件开发系列一索引 2015.8 by 田想兵 个人网站 从3月份进入新公司以来,时经五个月,我以平均每周1个小组件的速度,已经完成的js组件有22个之余了,已基本上全部用到实际项目中,这些小 ...
- [js开源组件开发]network异步请求ajax的扩展
network异步请求ajax的扩展 在日常的应用中,你可能直接调用$.ajax是会有些问题的,比如说用户的重复点击,比如说我只希望它成功提交一次后就不能再提交,比如说我希望有个正在提交的loadin ...
随机推荐
- java内存模型(jmm)概念初探
1.和java内存结构的区别: 很多人会把jmm和Java内存结构搞混,网上搜到的一些文章也是如此,java内存结构就是我们常说的堆,栈,方法区,程序计数器..., 当jvm虚拟机启动的时候,会初始化 ...
- WPF/MVVM模式入门教程(二):实现INotifyPropertyChanged接口
引用:https://www.cnblogs.com/flh1/p/12447188.html 1.创建NotifyPropertyChanged类 我们在common文件夹下创建一个名为Notify ...
- Linux 操作另一台服务器
服务器信任 在运维场景中,如果需要在一台服务器操作另一台服务器,就需要目标服务器(下面称为 B 服务器)信任当前服务器(下面称为 A 服务器). 在 A 服务器生成证书. ssh-keygen -t ...
- 编译安装cmake,linux编译安装cmake
cmake官网:https://cmake.org/ cmake官网下载地址:https://cmake.org/download/ 现在Linux版本最新版是:cmake-3.28.0-rc5.ta ...
- jemter返回结果中文乱码
如图,返回的结果,中文出现乱码 对于这个问题有两种解决方法 第一种:修改jemeter文件,需要重启jemter 在 bin 目录下,找到 jmeter.properties 这个文件,修改编码格 ...
- NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]
NL2SQL基础系列(1):业界顶尖排行榜.权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL.Text2DSL] Text-to-SQL(或者Text2S ...
- sql 语句系列(多表之链二)[八百章之第四章]
从多个表中返回缺失值 比如说查询每个员工的部门,且查看部门的所有员工. 这里考虑一种情况就是可能有部门没有员工,同样有些员工还没有分配部门. 解析使用 full outer join. select ...
- docker搭建kafka集群实践
前言 本文主要介绍了如何通过docker搭建一个可以用于生产环境的kafka集群. kafka集群使用了3个节点,依赖zookeeper进行协调,所以会同时搭建一套3节点的zookeeper集群. 准 ...
- h5py这个坑-PyCharm Process finished with exit code -1073741819 (0xC0000005)
在用pytorch和tensorflow做语音合成时,碰到了个很无解的bug, PyCharm 报错 Process finished with exit code -1073741819 (0xC0 ...
- ASP.NET CORE 框架揭秘读书笔记系列——ASP.NET应用程序(二)
一.ASP.NET 应用 一个ASP.NET CORE 应用构建在ASP.NET CORE 框架之上,ASP.NET CORE框架利用一个消息处理管道完成对HTTP请求的监听.接收.处理和最终的响应. ...