vue3 - 自定义弹框组件

在这里插入图片描述

写了一个弹框组件
<template><transition name="modal-fade"><div v-if="showFlag" class="myModal"><div class="content"><div class="topBox"><div class="leftTitle"><span>{{ title }}</span></div><div class="rightClose" @click="cancelModal"><CloseOutlined /></div></div><slot name="content"></slot></div></div></transition>
</template><script setup lang="ts">
import { ref, toRefs } from 'vue'const props = defineProps({title: {type: String,default: '',},
})const { title } = toRefs(props)// 是否开启弹框
let showFlag = ref(false)// 开启
const showModal = () => {showFlag.value = true
}// 关闭
const cancelModal = () => {showFlag.value = false
}defineExpose({showModal,cancelModal,
})
</script><style lang="less" scoped>
// 这个动画是,打开弹框时,有一个缓慢打开的效果
@keyframes fadeIn {from {opacity: 0;}to {opacity: 1;}
}// 打开弹框时给它一个上下抖动的效果
@keyframes shake {0% { transform: translateY(0); }25% { transform: translateY(-10px); }50% { transform: translateY(0); }75% { transform: translateY(10px); }100% { transform: translateY(0); }
}.myModal {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background: rgba(0, 0, 0, 0.4);z-index: 100;animation: fadeIn 0.5s;// animation: fadeIn 0.5s, shake 0.5s;.content {position: absolute;left: 50%;top: 30%;transform: translate(-50%, -50%);background: #ffffff;width: 500px;padding: 10px;.topBox {display: flex;height: 30px;border-bottom: 1px solid #f0f0f0;padding: 0 10px 0 0;margin-bottom: 20px;cursor: pointer;.leftTitle {flex: 1;text-align: left;color: rgba(0, 0, 0, 0.8);font-weight: 600;font-size: 16px;}.rightClose {flex: 1;text-align: right;}}}
}// start - 效果为:关闭时,有一个缓慢消失的效果
.modal-fade-enter-active, .modal-fade-leave-active {transition: opacity 0.5s;
}
.modal-fade-enter, .modal-fade-leave-to {opacity: 0;
}
// end - 效果为:关闭时,有一个缓慢消失的效果
</style>
使用它
<template><MyModal ref="myModal" :title="title"><template #content><div style="display: grid; place-items: center"><a-form ref="loginForm" :model="formState" :label-col="labelCol" style="width: 360px"><a-form-item has-feedback name="userName"><a-input v-model:value="formState.phone" placeholder="请输入手机号" autocomplete="off"><template #prefix><UserOutlined style="color: rgba(0, 0, 0, 0.25)" /></template></a-input></a-form-item><a-form-item has-feedback name="code"><a-inputv-model:value="formState.code"placeholder="验证码"autocomplete="off"style="width: 240px"><template #prefix><MailOutlined style="color: rgba(0, 0, 0, 0.25)" /></template></a-input><a-button:disabled="myState.smsSendFlag"v-text="(!myState.smsSendFlag && '获取验证码') || `${myState.time} s`"@click="getSms"style="margin-left: 15px"type="primary"></a-button></a-form-item><a-form-item style="text-align: center"><a-button style="width: 360px" type="primary" block @click="handleSubmit">登录</a-button></a-form-item></a-form></div></template></MyModal>
</template><script setup lang="ts">
import { ref } from 'vue'import * as accountApi from '@/api/account'import MyModal from '@/components/MyModal/MyModal.vue'
import { message } from 'ant-design-vue'const myModal = ref()const showModal = () => {myModal.value?.showModal()
}defineExpose({showModal,
})let title = ref('x管家登陆')const myState = reactive({smsSendFlag: false,time: 60,
})let labelCol = { span: 4 }
interface formState {phone: string | numbercode: string | number
}
const formState = ref<formState>({phone: '',code: '',
})// 获取验证码
const getSms = async () => {let params = {phone: formState.value.phone,}if (params['phone'] == '') {message.error(`手机号不能为空~`)return}const hide = message.loading('验证码发送中..', 0)try {let { state, message: msg } = await accountApi.idleSendSms(params)if (state === 200) {myState.smsSendFlag = trueconst interval = setInterval(() => {if (myState.time-- <= 0) {myState.time = 60myState.smsSendFlag = falseclearInterval(interval)}}, 1000)} else {message.error(msg)}} catch (error) {message.error('网络请求连接失败~')}setTimeout(hide, 1)
}// 登录
const handleSubmit = async () => {let params = {phone: formState.value.phone,code: formState.value.code,}try {const { state, message: msg, token } = await accountApi.idleLogin(params)if (state === 200) {message.success('登录成功~')myModal.value?.cancelModal()} else {message.error(msg)}} catch (error) {message.error('网络请求发送失败~')}
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/345227.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AUTO SEG-LOSS SEARCHING METRIC SURROGATES FOR SEMANTIC SEGMENTATION

AUTO SEG-LOSS: 搜索度量替代语义分割 论文链接&#xff1a;https://arxiv.org/abs/2010.07930 项目链接&#xff1a;https://github.com/fundamentalvision/Auto-Seg-Loss ABSTRACT 设计合适的损失函数是训练深度网络的关键。特别是在语义分割领域&#xff0c;针对不同的场…

苹果手机怎么恢复备份?详细攻略为你整理好了!

随着智能手机和互联网的普及&#xff0c;手机中存储的个人信息、照片、视频、聊天记录等数据会变得越来越多。一旦手机丢失、损坏或系统出现问题&#xff0c;我们很可能会面临数据丢失的风险。因此&#xff0c;越来越多的人开始意识到保护手机数据的重要性。 当苹果手机数据丢…

爬虫—响应页面乱码问题解决方法

爬虫—响应页面乱码问题解决方法 案例&#xff1a;腾牛网图片抓取 源代码如下&#xff1a; import requestsurl https://www.qqtn.com/wm/meinvtp_1.html headers {user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) …

[易语言]易语言部署yolox的onnx模型

【官方框架地址】 https://github.com/Megvii-BaseDetection/YOLOX 【算法介绍】 YOLOX是YOLO系列目标检测算法的进一步演变和优化。它由Megvii Technology的研究团队开发&#xff0c;是一个高性能、可扩展的对象检测器。YOLOX在保留快速处理速度的同时&#xff0c;通过引入一…

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数&#xff0c;比较通用&#xff0c;包含所有对象类型&#xff0c;可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数 PK_ENTITY_t entity; PK_CLASS_t PK_TYPE; PK_ENTITY_ask_class(e…

html的全选反选

一、实验题目 html实现选择框的全选和反选 二、实验代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>全选和反选</title></head><body><ul>兴趣爱好</ul><input id"all"…

怎么取消开机密码?4个必备方法!

“每次我开机都要输入密码&#xff0c;感觉有点麻烦&#xff0c;有什么方可以快速取消开机密码的吗&#xff1f;快给我推荐推荐吧&#xff01;” 为电脑设置开机密码&#xff0c;可以更好地保护电脑中的重要数据。但是用户需要在每次开机时都输入密码。这对于部分用户来说可能是…

【重明】机器视觉QT/C++实现工业相机二次开发框架

工业相机二次开发是机器视觉行业必不可少的技能之一。 而如何实现一个框架&#xff0c;能够兼容所有工业相机二次开发&#xff0c;从而支持多种类型的工业相机&#xff0c;就是机器视觉行业的进阶技能了。 重明工业相机二次开发项目就是在实现相机二开框架的基础上&#xff0c…

NetApp E系列(E-Series)OEM产品介绍以及如何收集日志和保存配置信息

NetApp E系列是NetApp收购LSI存储后建立的一条新的产品线&#xff0c;由于LSI存储的历史悠久&#xff0c;所以这条产品线给NetApp带来了很多的OEM产品&#xff0c;可以说E系列是世界上OEM给最多公司的存储产品线也不为过&#xff0c;因为最早LSI的产品销售测率就是OEM&#xff…

阿尔泰科技——PXIe8912/8914/8916高速数据采集卡

阿尔泰科技PXIe8912/8914/8916高速数据采集卡是2通道同步采样数字化仪&#xff0c;专为输入信号高达 100M 的高频和高动态范围的信号而设计。 与Labview无缝连接&#xff0c;提供图形化API函数。模拟输入范围可以通过软件编程设置为1V 或者5V。配备了容量高达 2GB的板载内存。…

代码随想录 Leetcode160. 相交链表

题目&#xff1a; 代码(首刷看解析 2024年1月13日&#xff09;&#xff1a; class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *A headA, *B headB;while (A ! B) {A A ! nullptr ? A->next : headB;B B ! nullpt…