Vue模态框的封装

news2024/12/21 18:51:08

一、模态框

1、模态框:若对话框不关闭,不能操作其父窗口

2、非模态框:对话框不关闭,可以操作其窗口

二、Vue组件实现模态框的功能

1、模态框是一个子组件

2、显示和隐藏由父组件决定

3、对话框的标题也是由父组件传递的

4、对话框的主显示区的内容由父组件决定的,使用插槽

5、对话框的宽度、高度、位置也是由父组件决定的

三、示例

将登录的功能加入模态框中

子组件HTML代码

<template>
  <div id="app">
    <div class="dialog-model">
        <!-- 根元素,z-index 需要高于父容器其他元素 -->
        <div class="dialog-wrapper" @click="onClose" v-show="isShow">
            <!-- 加载一个具有透明度的背景,使根元素透明,子元素会继承该透明度 -->
            <transition name="drop">               
                <div class="dialog-container" v-show="isShow">
                    <span class="close-btn" @click="onClose">x</span>
                    <slot></slot>
                </div>
            </transition>
        </div>
    </div>
  </div>
</template>

注意

其中<slot>标签为插槽,插槽相当于起到占位符的作用,插槽里面的内容由父组件决定。

子组件JS代码

<script>
export default {
    props:{
        isShow:{
            type:Boolean,
            default:false
        }
    },
    methods: {
    onClose() {
      this.$emit("on-close",false);
    },
  },
}
</script>

注意

模态框的开启和关闭由父组件决定,父组件传递boolean控制模态框,子组件通过props接收

自组件的Css代码

<style lang="scss" scoped>
.drop-enter-active {
  transition: all 0.5s;
}
.drop-leave-active {
  transition: all 0.3s;
}
.drop-enter {
  transform: translateY(-500px);
}
.drop-leave-active {
  transform: translateY(-500px);
}
.dialog-model{
    position: absolute;
    z-index: 5;
    .dialog-wrapper{

        position: fixed;
        height: 100%;
        width:100%;
        z-index:5;
        top: 0;
        left: 0;
        bottom: 0;
        right: 0;
        background-color: #eee;
        opacity: 0.9;
        .dialog-container{
            position:fixed;
            z-index: 80;
            top: 10%;
            left: 25%;
            width: 30%;
            background-color: #eee;
            border-radius: 3px;
            box-shadow: 0 5px 15px rgba(0,0,0,0.5);
            span{
                padding: 0 5px;
                float: right;
                cursor: pointer;
                font-size: 18px;
                font-weight: bold;
            }
            
        }
    }
}
</style>

父组件代码

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png" />
    <button @click="openModal">打开对话框</button>
    <Modal class="modal" :isShow="flag" @on-close="closeThis()">
      <h3>欢迎登陆</h3>
      <div>
        <form action="#" class="biaoDan">
          <div class="userMsg">
            <span>用户名:<input type="text" name="" value="" /></span>
            <span>密&nbsp;&nbsp;&nbsp;码:<input type="password" name="" value="" /></span>
          </div>
          <div class="btn">
            <button>登录</button>
            <button>取消</button>
          </div>
        </form>
      </div>
    </Modal>
  </div>
</template>

将表格写入插槽的位置

父组件JS代码:

<script>
import Modal from "./components/Modal.vue";
export default {
  name: "App",
  components: {
    Modal,
  },
  data() {
    return {
      flag: true,
    };
  },
  methods: {
    closeThis(val) {
      this.flag = val;
    },
    openModal() {
      this.flag = true;
    },
  },
};
</script>

父组件的CSS代码:

<style lang="scss" scoped>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
  button {
    width: 100px;
    height: 30px;
    border: none;
    color: white;
    text-align: center;
    background-color: cornflowerblue;
    border-radius: 10px;
    cursor: pointer;
  }
  .modal {
    div {
      display: flex;
      flex-direction: row;
      justify-content: space-around;
      align-items: center;
      .biaoDan {
        width: 300px;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        margin-bottom: 30px;
        .userMsg{
          display: flex;
          flex-direction: column;
          align-items: end;
          span{
            margin-top:30px ;
          }
        }
        .btn {
          width: 100%;
          margin-top: 20px;
          display: flex;
          flex-direction: row;
          justify-content: space-around;
          align-items: center;
        }
      }
    }
  }
}
</style>

在这里应用的scss编译修饰

这里需要注意的是,当制作登录框时会碰到,input输入框和前面的文字往往无法对齐,这里采取的

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

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

相关文章

OpenAPI SDK组件之Spring Aop源码拓展

Spring Aop 看这个分享的应该都用过Spring Aop&#xff0c;这里就不再过多介绍了它是什么了。 我抽取了Spring Aop的部分源码&#xff0c;通过它实现请求参数可变拦截&#xff0c;同时apisdk离开Spring框架&#xff0c;仍然可以正常运行。 讲拦截也好&#xff0c;通知也罢&a…

[蓝桥杯 2022 国 B] 卡牌(贪心/二分)

题目传送门 该题第一思路是想去模拟题目中所描述的过程 这里我选择从大到小遍历可能凑出的牌套数&#xff0c;计算凑出它需要补的牌数以及判断是否会超出能补的牌数 #include<iostream> #include<climits> #include<vector> #include<algorithm> #def…

深拷贝与浅拷贝的理解

浅拷贝的理解浅拷贝的话只会拷贝基本数据类型&#xff0c;例如像string、Number等这些&#xff0c;类似&#xff1a;Object、Array 这类的话拷贝的就是对象的一个指针(通俗来讲就是拷贝一个引用地址&#xff0c;指向的是一个内存同一份数据)&#xff0c;也就是说当拷贝的对象数…

【人工智能 AI】What is RPA? 什么是机器人流程自动化?

目录 Introduction to RPA 机器人流程自动化简介 What is RPA? 什么是机器人流程自动化?

17、触发器

文章目录1 触发器概述2 触发器的创建2.1 创建触发器语法2.2 代码举例3 查看、删除触发器3.1 查看触发器3.2 删除触发器4 触发器的优缺点4.1 优点4.2 缺点4.3 注意点尚硅谷MySQL数据库教程-讲师&#xff1a;宋红康 我们缺乏的不是知识&#xff0c;而是学而不厌的态度 在实际开发…

数据结构:各种排序方法的综合比较

排序方法的选用应视具体场合而定。一般情况下考虑的原则有:(1)待排序的记录个数 n;(2)记录本身的大小;(3)关键字的分布情况:(4)对排序稳定性的要求等。 1.时间性能 (1) 按平均的时间性能来分,有三类排序方法: 时间复杂度为 O(nlogn)的方法有:快速排序、堆排序和归并排序,其中…

前端一面必会面试题(边面边更)

哪些情况会导致内存泄漏 以下四种情况会造成内存的泄漏&#xff1a; 意外的全局变量&#xff1a; 由于使用未声明的变量&#xff0c;而意外的创建了一个全局变量&#xff0c;而使这个变量一直留在内存中无法被回收。被遗忘的计时器或回调函数&#xff1a; 设置了 setInterval…

P1196 [NOI2002] 银河英雄传说 带权并查集

[NOI2002] 银河英雄传说 题目背景 公元 580158015801 年&#xff0c;地球居民迁至金牛座 α\alphaα 第二行星&#xff0c;在那里发表银河联邦创立宣言&#xff0c;同年改元为宇宙历元年&#xff0c;并开始向银河系深处拓展。 宇宙历 799799799 年&#xff0c;银河系的两大军…

使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中&#xff0c;有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息。古人是用Oracle做数仓&#xff0c;理所当然是用SQL写UDF【虽然SQL写UDF给SQL用就像用鸡肉饲养肉…

Gin获取Response Body引发的OOM

有轮子尽量用轮子 &#x1f62d; &#x1f62d; &#x1f62d; &#x1f62d; &#x1f62d; &#x1f62d; 我们在开发中基于Gin开发了一个Api网关&#xff0c;但上线后发现内存会在短时间内暴涨&#xff0c;然后被OOM kill掉。具体内存走势如下图&#xff1a; 放大其中一次 在…

OllyDbg

本文通过吾爱破解论坛上提供的OllyDbg版本为例&#xff0c;讲解该软件的使用方法 F2对鼠标所处的位置打下断点&#xff0c;一般表现为鼠标所属地址位置背景变红F3加载一个可执行程序&#xff0c;进行调试分析&#xff0c;表现为弹出打开文件框F4执行程序到光标处F5缩小还原当前…

EF 框架的简介、发展历史;ORM框架概念

一、EF 框架简介EF 全称是 EntityFramework 。Entity Framework是ADO.NET 中的一套支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。ORM框架&#xff08;Object Relational Mapping&#xff09; 翻译过来就是对象关系映射。如果不用ORM框架&#xff0c;我们一般这样…

考虑交叉耦合因素的IPMSM无传感器改进线性自抗扰控制策略

考虑交叉耦合因素的IPMSM无传感器改进线性自抗扰控制策略一级目录二级目录三级目录控制原理ELADRC信号提取龙格贝尔观测器方波注入simulink仿真给定转速&#xff1a;转速环&#xff1a;电流环&#xff1a;一级目录 二级目录 三级目录 首先声明一下&#xff0c;本篇博客是复现…

分析 HTTP,TCP 的长连接和短连接以及 socket

1、HTTP 协议与 TCP/IP 协议的关系 HTTP 的长连接和短连接本质上是 TCP 长连接和短连接。HTTP 属于应用层协议&#xff0c;在传输层使用 TCP 协议&#xff0c;在网络层使用 IP 协议。IP 协议主要解决网络路由和寻址问题&#xff0c;TCP 协议主要解决如何在 IP 层之上可靠的传递…

Apache Hadoop生态部署-Flume采集节点安装

目录 Apache Hadoop生态-目录汇总-持续更新 一&#xff1a;安装包准备 二&#xff1a;安装与常用配置 2.1&#xff1a;下载解压安装包 2.2&#xff1a;解决guava版本问题 2.3&#xff1a;修改配置 三&#xff1a;修复Taildir问题 3.1&#xff1a;Taildir Source能断点续…

SpringMVC请求转发和重定向

请求转发&#xff1a;forward:重定向&#xff1a;redirect转发&#xff1a;由服务器的页面进行跳转&#xff0c;不需要客户端重新发送请求&#xff1a;特点如下&#xff1a;1、地址栏的请求不会发生变化&#xff0c;显示的还是第一次请求的地址2、请求的次数&#xff0c;有且仅…

已解决kettle新建作业,点击保存抛出异常Invalid state, the Connection object is closed.

已解决kettle新建作业&#xff0c;点击保存进资源数据库抛出异常Invalid state, the Connection object is closed.的解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录报错问题报错翻译报错原因解决方法联系博主免费帮忙解决报错报错问题 一个小伙伴…

JS 执行机制 详解(附图)

一、JS是单线程JS语言的一大特点就是单线程&#xff0c;也就是说&#xff0c;同一个时间只能做一件事。这是JS这门脚本语言诞生的使命所致——用来处理页面中用户的交互&#xff0c;以及操作DOM而诞生的。单线程就意味着&#xff0c;所有任务需要排队&#xff0c;前一个任务结束…

C++014-C++字符串

文章目录C014-C字符串字符串目标char[]和stringchar[]char*string字符常量与字符串常量字符串的输入题目描述 字符串输出题目描述在线练习&#xff1a;总结C014-C字符串 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 字符串 目标 1、了解字符串…

OAuth2.0从入门到实战(附github地址)

OAuth2.0 文章目录OAuth2.0OAuth2.0的含义与思想[快递员的例子]([OAuth 2.0 的一个简单解释 - 阮一峰的网络日志 (ruanyifeng.com)](https://www.ruanyifeng.com/blog/2019/04/oauth_design.html))互联网的例子令牌与密码OAuth2.0的四种授权方式RFC 6749一、授权码(前后端分离)…