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 面向对象编程与类属性应用
Java 面向对象编程 面向对象编程 (OOP) 是一种编程范式,它将程序组织成对象.对象包含数据和操作数据的方法. OOP 的优势: 更快.更易于执行 提供清晰的结构 代码更易于维护.修改和调试 提 ...
- Qt 实现涂鸦板二:实现放大功能
在一的基础上改造: .h 文件 #pragma once #include <QtWidgets/QWidget> #include "ui_xuexi.h" #inc ...
- tkinter属性--转载Tynam Yang
一.主要控件 1.Button 按钮.类似标签,但提供额外的功能,例如鼠标掠过.按下.释放以及键盘操作事件 2.Canvas 画布.提供绘图功能(直线.椭圆.多边形.矩形) 可以包含图形或位图 3.C ...
- 三步配置阿里巴巴durid监控
三步配置阿里巴巴durid监控 官方文档 环境:jdk17, 框架springboot3 引入依赖 <properties> <druid>1.2.21</druid&g ...
- openGauss升级脚本撰写
概述 重要提示: 升级过程通过执行升级 sql 脚本实现系统表变更,这些脚本必须由开发人员在修改系统表的同时一并提供升级 sql 脚本,请将这些脚本代码提交至 openGauss-server/src ...
- Unity 音乐或者视频播放完毕之后执行方法
视频播放完毕后,执行某个方法 方法1 官方给的解释 private VideoPlayer video2; private void Awake() { video2.loopPointReached ...
- HarmonyOS 自定义页面请求与前端页面调试
一.自定义页面请求响应 Web组件支持在应用拦截到页面请求后自定义响应请求能力.开发者通过onInterceptRequest()接口来实现自定义资源请求响应 .自定义请求能力可以用于开发者自定义 ...
- HDC2021技术分论坛:HarmonyOS本地模拟器重磅来袭!
作者:longjiangyun,模拟器开发工程师 HarmonyOS模拟器是应用开发者使用IDE进行代码开发.调试.测试等活动中必不可少的工具,它分为本地模拟器和远程模拟器,其中远程模拟器又分为单设备 ...
- HarmonyOS Connect “Device Partner”专场FAQ来啦!
原文链接:https://mp.weixin.qq.com/s/mQJlAso293qgPlA1paxv5g,点击链接查看更多技术内容: Device Partner平台是面向AIoT产业链 ...
- 【直播回顾】Hello HarmonyOS进阶课程第五课——原子化服务
由HDE李洋老师主讲的Hello HarmonyOS进阶系列应用篇第五课<原子化服务>, 已于6月1日晚上 19 点在HarmonyOS社群内成功举行.本节课李洋老师带领大家了解Harmo ...