十五分钟两百行代码,手写一个vue项目全局通用的弹框

本文主要是介绍十五分钟两百行代码,手写一个vue项目全局通用的弹框,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

我们在写vue项目时,弹框是非常常用的组件,并且在同一个项目中,弹框大多类似。所以我们可以抽离封装出一个通用的弹框;

因为vue3可向下兼容,所以作者这边会使用vue2的写法,vue3写法大同小异。

第一步:新建相关文件

一般来说是在src/components/dialog下新建如下两个文件:

  1. index.vue:该文件是组件内容相关的,用来书写弹框组件的结构、样式、和动态逻辑;
  2. index.js:该文件使用虚拟节点创建组件内容,并且注册组件。

第二步:书写组件内容

index.vue组件内容如下:

  1. 结构 + js 代码
<template><div class="default-message" :id="boxId"><div class="default-message-content"><div class="default-message-title">{{ title }}</div><div class="default-message-value" v-html="message"></div><div class="default-message-btns"><divclass="default-message-cancle default-message-btn"v-if="cancelBtnHtml"@click.prevent.stop="handleCancel">{{ cancelBtnHtml }}</div><divclass="default-message-submit default-message-btn"@click.prevent.stop="handleOk">{{ okBtnHtml }}</div></div></div></div>
</template><script>
import i18n from "@/i18n";
import { defineComponent } from "vue";
export default defineComponent({name: "Dialog",data() {return {i18nTitle: '',i18nOkBtn: '',};},props: {boxId: {type: String,default: "",},// 标题title: {type: String,default: "",},// 内容message: {type: String,default: "",},// 确定按钮文字okBtnHtml: {type: String,default: '',},// 取消按钮文字cancelBtnHtml: {type: String,default: "",},// 成功回调ok_function: {type: Function,},// 失败回调cancel_function: {type: Function,},},methods: {handleCancel() {this.removeModal();this.cancel_function && this.cancel_function();},handleOk() {this.removeModal();this.ok_function && this.ok_function();},removeModal() {const modelDom = document.getElementById("__default__container__content__");if (modelDom) {document.body.removeChild(modelDom);}},},created() {this.i18nTitle = i18n.global.t('modal_warm_tip_title');this.i18nOkBtn = i18n.global.t('activity_ok');},
});
</script>

结构说明:

  • .default-message使我们整个弹框的容器,一般宽高都设置为100%,这个部分会有一个半透明的背景色(覆盖页面内容,防止弹框了还能操作页面);
  • .default-message-content为整个弹框的内容区域,包括标题、提示信息、取消按钮、确定按钮;
  • 取消按钮和确定按钮支持执行传入的事件,方便我们在弹框弹出后点击按钮执行相应操作;
  1. 样式
<style lang="less" scoped>
.default-message {position: fixed;right: 0;top: 0;bottom: 0;left: 0;width: 100%;height: 100%;z-index: 1000;background: rgba(0, 0, 0, 0.7);.default-message-title {color: #333;margin: 0;line-height: 1.5;font-size: 18px;min-height: 18px;padding-top: 20px;text-overflow: ellipsis;font-weight: bold;cursor: move;text-align: center;}.default-message-content {width: 85%;position: absolute;top: 50%;left: 50%;transform: translate3d(-50%, -50%, 0);background-color: #fff;border-radius: 6px;transition: all 0.2s ease-in;color: #999;font-size: 18px;}.default-message-value {padding: 28px 18px;text-align: center;position: relative;color: #999;text-align: center;font-size: 14px;color: rgba(102, 102, 102, 1);}.default-message-btns {// border-top: 1px solid #ddd;display: flex;height: 60px;position: relative;&:after {position: absolute;content: "";display: inline-block;left: 0;right: 0;top: 0;height: 1px;transform: scaleY(0.5);background: #ddd;}.default-message-btn {flex: 1;display: flex;align-items: center;justify-content: center;font-size: 16px;padding: 0 3px;}.default-message-submit {color: #26a2ff;}.default-message-cancle {color: #999;position: relative;&:after {position: absolute;content: "";display: inline-block;top: 0;right: 0;bottom: 0;width: 1px;transform: scaleX(0.5);background: #ddd;}}}@keyframes fadeIn {from {opacity: 0;}to {opacity: 1;}}
}
</style>

第三步:注册成全局组件

import {createVNode, render} from 'vue';
import MessageConstructor from './index.vue';const $dialog = function (options) {// 已存在一个弹窗则不重复渲染if (!document.getElementById ('__default__container__content__')) {// 创建divconst container = document.createElement ('div');// container.className = `__default__container__message__`;container.id = '__default__container__content__';//创建虚拟节点const vm = createVNode (MessageConstructor, options);//渲染虚拟节点render (vm, container);document.body.appendChild (container);}
};export default {//组件注册install (app) {app.config.globalProperties.$dialog = $dialog;},
};

到这里,我们的弹框组件就完成了,接下来我们来使用看看。

项目中使用弹框

使用的方法也非常简单,所见即所得。

app.config.globalProperties.$dialog({title: "弹框标题",message: "弹框提示信息文案",okBtnHtml: "确定",cancelBtnHtml: "取消",ok_function: () => {console.log("点击弹框确定按钮处理函数");},cancel_function: () => {console.log("点击弹框取消按钮处理函数");}
});

说明:

  1. 标题、提示文案、以及取消和确定按钮文案,我们这边直接传入,ok_function是确定按钮的回调,我们可以在这里做任何点击确定后想做的事,包括发送请求和异步操作,cancel_function同理。
  2. 弹框图片示例:

在这里插入图片描述

写在后面

这是一个比较基础的弹框组件,这边示例的代码是比较全的,对细节要求不大的小伙伴可以直接用;

背景颜色、字体、布局等这些细节,因为每个业务场景不同,大家可以根据自己的需要适当调整;

弹框是固定单位的,如果小伙伴的项目需要使用响应式大小,直接对应替换大小单位即可;

对你有帮助的话给作者点点关注吧,你的支持是我不断更新的动力!Peace and love~~

这篇关于十五分钟两百行代码,手写一个vue项目全局通用的弹框的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099218

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的