前端开发Vue3.0 标签setup语法『UI组件库』之『模态框』【业务提升必备】

news2024/11/18 19:37:53

 封装模态框需要定义的参数

  title //弹窗标题
  show   // 是否显示弹窗
  width  // 弹窗宽度
  height  // 弹窗高度
  borderRadius   // 弹窗圆角
  headerColor // 弹窗顶部颜色
  contentText // 内容文本
  contentTextCorder //内容文本颜色
  position // 标题的位置
  btnGroupShow // 按钮的显示隐藏
  confirmText // 确认按钮的文本
  cancelText // 取消按钮的文本

封装模态框需要定义的方法

const cancelHandler = () => {
    // 关闭弹窗的方法
}

const confirmHandler = () => {
   // 弹窗点击确认的方法
}

在components文件新建一个modal-dialog.vue文件

1、defineProps 在Vue 3中,defineProps 是一个用于定义传入组件的 Props 的函数。它通常用在组合式 API 或 Composition API 中。

2、defineEmits 的用法 defineEmits的用法是在子组件中定义接收父组件传过来的方法

<template>
  <div class="modal-box" v-if="show">
    <div class="dialog-box" :style="{
      'background-color':props.contentTextCorder,
      'border-radius':props.borderRadius + 'px',
      'text-align': props.position,
      'width':props.width + 'px',
      'height':props.height + 'px'
    }">
      <header
      :style="{
       'background-color':headerColor,
       'border-top-left-radius':props.borderRadius + 'px',
        'border-top-right-radius':props.borderRadius + 'px',
      }">
        <text>{{props.title}}</text>
      </header>
      <div class="icon" @click="cancelHandler">X</div>
      <div class="content">
         <p v-if="props.contentText" :style="{
           'color':props.contentTextCorder
         }">
           {{props.contentText}}
         </p>
        <slot name="content"></slot>
      </div>
      <footer>
        <div class="btn-box">
          <button v-if="props.btnGroupShow" class="boom" @click="cancelHandler">{{props.cancelText }}</button>
          <button v-if="props.btnGroupShow" class="boom" @click="confirmHandler">{{props.confirmText }}</button>
        </div>
      </footer>
    </div>
  </div>
</template>

<script setup>
import {defineProps,defineEmits} from "vue";
const emit = defineEmits(['confirm','close'])
const props = defineProps({
  //弹窗标题
  title:{
    type:String,
    default:'弹窗标题'
  },
  // 是否显示弹窗
  show:{
    type:Boolean,
    default:false
  },
  // 弹窗宽度
  width:{
    type:Number,
    default:500
  },
  // 弹窗高度
  height:{
    type:Number,
    default:200
  },
  // 弹窗圆角
  borderRadius:{
    type:Number,
    default:20
  },
  // 弹窗顶部颜色
  headerColor:{
    type:String,
    default:'blue'
  },
  // 内容文本
  contentText:{
    type:String,
    default:null
  },
  contentTextCorder:{
    type:String,
    default:'#fff'
  },
  position:{
    type:String,
    default:'center'
  },
  btnGroupShow:{
    type:Boolean,
    default:true
  },
  confirmText:{
    type:String,
    default:'是'
  },
  cancelText:{
    type:String,
    default:'否'
   }
})

const cancelHandler = () => {
  emit('close')
}

const confirmHandler = () => {
  emit('confirm')
}

</script>

<style scoped>

.modal-box{
  width: 100%;
  height: 100%;
  position: fixed;
  left: 0;
  top: 0;
  background-color: rgb(0,0,0,0.4);
}
.modal-box .dialog-box{
  background-color: #fff !important ;
  position: relative;
  left: 50%;
  top: 20%;
  transform: translate(-50%,-20%);
}
.icon{
  position: absolute;
  top: 10px;
  right: 15px;
  background-color: #ec6a5d;
  border-radius: 50%;
  width: 20px;
  height: 20px;
  text-align: center;
  color: #464444;
  font-size: 10px;
  line-height: 20px;
}
.icon:hover{
  cursor: pointer;
}
header{
  width: 100%;
  height: 40px;
  line-height: 40px;
  padding:0 10px 0 10px;
  box-sizing: border-box;
}
footer{
  width: 100%;
  height: 40px;
  position: absolute;
  left: 0;
  bottom: 0;
  display: flex;
  justify-content: flex-end;
  border-top: 1px solid #ccc;
}
footer .btn-box {
  width: 25%;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: space-around;
}
footer .btn-box button {
  height: 26px;
}
.content{
  width: 100%;
  padding:0 10px 0 10px;
  box-sizing: border-box;
}
button{
  border: 0;
  border-radius: 5%;
  cursor: pointer;
}

.boom {
  background-color: #16a085;
  color: #fff;
  position: relative;
  z-index: 1;
}

.boom::before {
  content: "";
  position: absolute;
  z-index: -1;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  border: 2px solid #16a085;
  border-radius: 20px;
  transform-origin: center;
}

.boom:hover::before {
  transform: scale(1.25);
  transition: all ease-out .5s;
  border: 1px solid #96f3e0;
  opacity: 0;
}


</style>

index.vue主组件

<template>
   <div>
     <ul>
       <li>
         3243243242343243243242
       </li>
       <li>
         3243243242343243243242
       </li>
       <li>
         3243243242343243243242
       </li>
     </ul>
     <button @click="openDialog">打开弹窗</button>
     <modal-dialog
      :title="title"
      :show="isShow"
      :width="500"
      :height="200"
      :borderRadius="10"
      headerColor="skyblue"
      contentText="This is a super modal this is a super madel"
      contentTextCorder="red"
      position="left"
      :btnGroupShow="true"
      confirmText="确定"
      cancelText="取消"
      @confirm="modalConfirm"
      @close="modalClose"
     >
       <template v-slot:content>
         <h3>我是具名插槽</h3>
       </template>
     </modal-dialog>
   </div>
</template>

<script setup>
// 引入组件不用注册
import modalDialog from './components/modal-dialog.vue'

import {ref} from 'vue'
const title = ref('我是弹窗')
const isShow = ref(false)

// 弹窗的确认事件

const modalConfirm = () => {
  isShow.value = false
}

// 弹窗的关闭事件

const modalClose = () => {
  isShow.value = false
}


const openDialog = () => {
  isShow.value = true
}

</script>

<style>
a{
  color: skyblue;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

暴力猴插件开发简明教程->百度首页默认设置为我的关注

文章目录 暴力猴插件开发简明教程->百度首页默认设置为我的关注缘起缘灭思路实现尾声 暴力猴插件开发简明教程->百度首页默认设置为我的关注 缘起 在我的百度首页有很多自己设置的导航链接(接近100个),里面放了我常用的网站, 如下图 但是最近一段时间, 我发现百度做了一…

腾讯云 CODING 成为首批 TISC 企业级平台工程综合能力要求标准贡献单位

点击链接了解详情 今天&#xff0c;由中国信通院主办的“2023 数字生态发展大会”暨中国信通院“铸基计划”年中会议在京召开。本次大会全面总结了“铸基计划”上半年度工作成果&#xff0c;帮助行业解析数字化转型发展趋势&#xff0c;链接供给侧和需求侧企业&#xff0c;以期…

2022年数学建模国赛c题论文+代码(附详解)

古代玻璃制品化学成分的分析与研究 摘要 古代玻璃极易受埋藏环境的影响而风化&#xff0c;并且在风化过程中&#xff0c;内部元素与环境元素进行着大量交换&#xff0c;导致其成分比例会发生变化&#xff0c;从而会影响对其类别的正确判断。玻璃在炼制的过程中需要添加助熔剂…

【Git】修改文件版本回退撤销修改删除文件

文章目录 修改文件版本回退git reset语法规则注意 撤销修改情况1&#xff1a;工作区的代码还未add情况2&#xff1a;工作区的代码已经add 但未commit情况3&#xff1a;工作区的代码已经add 并且已经 commit 删除文件 修改文件 Git⽐其他版本控制系统设计得优秀&#xff0c;Git…

postgresgl数据库的部署与优化

文章目录 一.postgresgl数据库1.postgresgl数据库的概念1.1 PostgreSQL 的核心概念 2.PostgreSQL特点3.PostgreSQL的作用4.PostgreSQL的应用场景5.PostgreSQL、mysql、oracle的对比 二.Linux系统安装PostgresSQL&#xff08;Centos7&#xff09;1.更新yun源2.安装PostgreSQL2.1…

Vue的router学习

,前端路由的核心是什么呢&#xff1f;改变URL&#xff0c;但是页面不进行整体的刷新。 vue-router是基于路由和组件的  路由用于设定访问路径, 将路径和组件映射起来&#xff1b;  在vue-router的单页面应用中, 页面的路径的改变就是组件的切换&#xff1b; 使用router需要…

QT 使用串口

目录 1.1.1 添加库&#xff0c;添加类 1.1.2 定义串口 1.1.3 搜索串口 1.1.4 设置和打开串口 1.1.5 读取数据 1.1.6 发送数据 1.1.7 关闭串口 1.1.1 添加库&#xff0c;添加类 首先&#xff0c;QT5 是自带 QSerialPort(Qt5 封装的串口类)这个类的&#xff0c;使用时…

单相锁相环原理与代码实战解释

单相锁相环程序原理如下图所示 单相锁相环原理 锁相环&#xff08;PLL&#xff09;是一种常用于同步、解调和信号处理等领域的电路或数字算法&#xff0c;其主要作用是将一个输入信号的相位与频率与参考信号进行精确的匹配。这里我们来简单解释一下单相锁相环的原理和分析。 …

自媒体行业下滑的5个标志

我是卢松松&#xff0c;洞察草根行业趋势&#xff01;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 未来大量的自媒体人将面临失业&#xff0c;80%的自媒体人收益没办法养活自己。前两天卢克文说自媒体的发展其实已经到达巅峰期&#xff0c;慢慢开始走下坡路了。我认…

Java集合框架的全面分析和性能增强

Java集合框架的全面分析和性能增强 &#x1f497;摘要&#xff1a;&#x1f497; 1. Java集合框架概述&#x1f497;1.1 Collection接口1.1.1 List接口1.1.2 Set接口1.1.3 Queue接口 &#x1f497;1.2 Map接口 &#x1f497;2. Java集合框架性能优化&#x1f497;2.1 选择合适的…

vue新学习 02 vue命令v-model,数据代理(作用域和作用域链),事件,监听,条件渲染,计算属性(也就是把操作属性的语句放到vue实例中)

双向绑定用命令v-model&#xff1a; v-bind的命令是单项去绑定data中的相关属性&#xff0c;此时的data是真正的data&#xff0c;并没有用变量声明的方式去接收vue实例对象&#xff0c;也就是例如用const vm new Vue({})。而是直接就采用了new Vue&#xff08;{}&#xff09;这…

戴琼海院士——人工智能正深刻地改变这个时代

原创 | 文 BFT机器人 2023世界人工智能大会将继续发挥“科技风向标、应用展示台、产业加速器、治理议事厅”的重要作用&#xff0c;打造“会议论坛、展览展示、评奖赛事、应用体验”四大核心内容&#xff0c;汇聚世界顶级科学家、企业家、政府官员、专家学者、国际组织、投资人…

Ssm+Mysql实现的Java Web酒店管理项目源码附带视频指导运行教程及需求文档

由ssmmysql实现的一款酒店管理系统&#xff0c;该系统实现了酒店客房预订管理的基本功能&#xff0c;还增加了图表显示统计结果的功能有需要的可以联系我分享给大家&#xff0c;下面是运行后的一些截图&#xff1a;

【密码学】四、SM4分组密码算法

SM4分组密码算法 1、概述1.1初始变量算法1.2密钥扩展算法1.3轮函数F1.3.1合成置换T1.3.2S盒 2、算法设计原理2.1非平衡Feistel网络2.2T变换2.2.1非线性变换τ2.2.2线性变换L2.2.3基础置换 2.3密钥扩展算法的设计 1、概述 SM4分组密码算法是一种迭代分组密码算法&#xff0c;采…

使用requests库发送http请求

1. get请求 # 导入requests库 import requests# 此处使用的接口地址为zrlog系统后台登录首页的地址 url "http://172.16.171.129/admin/login"# 通过requests库发送get请求 r requests.get(url url)# 以文本的方式返回响应内容 print(r.text)# 返回HTTP协议状态码…

qssh使用

到官网下载qssh的源码QSsh-botan-1&#xff0c;使用qtcreator打开后&#xff0c;直接编译&#xff0c;即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下&#xff0c;即为库头文件。 qssh有个问题&#xff0c;如果你将qssh的类放在子线程…

定时发朋友圈怎么设置?

目前微信作为最大的社交平台之一&#xff0c;吸引了众多使用者。你是否听过有些朋友感叹这么多微信号&#xff0c;需要每天手动发布朋友圈&#xff0c;任务很繁琐呢&#xff1f;是否希望可以事先设置好定时发送的功能&#xff0c;让朋友圈自动更新&#xff0c;省去手动发送的麻…

sqlserver row _number函数的运用

sql语句&#xff1a; select dept_id,stcd,row_number() over (partition by dept_id ORDER BY STCD) as 排序 from tb_station_config 这段代码是使用ROW_NUMBER()函数结合窗口函数的语法&#xff0c;用于给结果集中的每一行分配一个唯一的序号。 具体解释如下&#xff1a; R…

uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)

本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定位信息, 位置更新也会触发相关自定义事件 优点 只设置一次不采用定时器的方式无需多个页面调用单独页面若想获取当前位置是否变化 可单独设置监听,并调用不同逻辑事件 原理: 采用uniapp推出的: un…

基于深度强化学习的DQN模型实现自动玩俄罗斯方块游戏(附详细代码讲解)

一、DQN&#xff08;Deep Q-Network&#xff09;方法概述 DQN&#xff08;Deep Q-Network&#xff09;是一种强化学习方法&#xff0c;通过结合Q-learning算法和深度神经网络来解决强化学习问题。它是深度强化学习的里程碑之一&#xff0c;由DeepMind在2013年提出&#xff0c;被…