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 ...
随机推荐
- 在Centos 8 服务器用tmux多开窗口
在 CentOS 服务器上使用 tmux 来多开窗口是一个高效的方式.tmux 是一个终端复用器,它允许你在一个终端窗口中打开多个终端会话,还可以在会话之间轻松切换,非常适合长时间运行程序或多任务操作 ...
- C 语言数组教程:定义、访问、修改、循环遍历及多维数组解析
C 数组 数组用于将多个值存储在单个变量中,而不是为每个值声明单独的变量. 要创建数组,请定义数据类型(例如 int)并指定数组名称,后面跟着方括号 []. 要将值插入其中,请使用逗号分隔的列表,并在 ...
- Qt搜索本机网卡对应网段的在线设备
需求:销售给我的需求是找出哪些IP是没有被占用的,所以我要先找出已经被占用的IP 项目是Qt开发的,所以在网上搜索了下,搜索到的实现方式都是:QHostInfo::lookupHost,但是这种方式, ...
- 如何翻译 Markdown 文件?-2-几种商业及开源解决方案介绍
背景 近期在搭建英文博客-<e-whisper.com>, 需要对现有的所有中文 Markdown 翻译为英文. 需求如下: 将 Markdown 文件从中文 (zh-CN) 翻译为英文 ...
- Python 爬虫之 xpath
0x01 XML 基础 xpath 是在 XML 文档中搜索内容的一门语言 HTML 是 XML 的一个子集 XML 代码举例: <book> <isbn>978xxxxxxx ...
- Python Flask获取iOS的UDID
测试iOS app时候,我们可以安装以下4种类型的包 : AdHoc -- 一般为正式环境验证AppStore -- 上传AppStore,只有 ...
- leetcode - 子数组最大平均值
给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例: 输入:[1,12,-5,-6,50,3], k = 4 输出:12.75 解释:最大平均数 (12-5-6+5 ...
- ddddocr基本使用和介绍
ddddocr基本使用和介绍 摘要:在使用爬虫登录网站的时候,经常输入用户名和密码后会遇到验证码,这时候就需要用到今天给大家介绍的python第三方库ddddocr,ddddocr是一款强大的通用开源 ...
- 树上点差分的经典应用 LuoguP3258松鼠的新家
树上点差分的核心就是如何避免重复,即正确的运用差分数组 例如a,b点路径上点权值加1,则把a,b路径找到,并找到其LCA,此时可以把a到根,b到根这两条路径看出两条链,把每条链看出我们熟悉的 顺序差分 ...
- 力扣500(java&python)-键盘行(简单)
题目: 给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词.键盘如下图所示. 美式键盘 中: 第一行由字符 "qwertyuiop" 组成.第 ...