返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue中的slot封装组件弹窗
  • 759
分享到

vue中的slot封装组件弹窗

2024-04-02 19:04:59 759人浏览 薄情痞子
摘要

目录slot封装组件弹窗Vue组件slot入门---弹窗组件插槽的基础使用弹窗组件slot封装组件弹窗 <template>   <el-dialog :title

slot封装组件弹窗

<template>
  <el-dialog :title="title" :visible.sync="dialogVisible" :width="width" center>
    <slot name="content"></slot>
  </el-dialog>
</template>
<script>
export default {
  props: ["title", "width", "dialogVisible"],
  data() {
    return {};
  }
};
</script>
<style lang="less">
.el-dialog__header {
  padding: 20px 20px 10px;
  display: none;
}
.el-dialog__body {
  padding: 0px !important;
}
</style>
 <!-- 弹窗 -->
        <DialogModal :width="'552px'" :title="'加入黑名单'" :dialogVisible="centerDialogVisible">
          <div slot="content" class="popup">
            <div class="head">
              加入黑名单
              <i class="el-icon-close" @click="handelCloseModal()"></i>
            </div>
            <p class="isAdd">确定要讲客户王佳琛加入甄别黑名单?</p>
            <div class="confirm">
              <el-button type="primary">确定</el-button>
              <el-button plain>取消</el-button>
            </div>
          </div>
        </DialogModal>
 
        <!-- 弹窗 -->

vue组件slot入门---弹窗组件

slot 即插槽,相当于在子组件的 DOM 中留一个位置,父组件如果有需要,就可以在插槽里添加内容。

插槽的基础使用

这里是一个插槽的简单用法。

1.在子组件 Modal.vue 中用 slot 标签预留一个位置,slot 标签中的内容是后备内容,也可以为空:

<div class="modal-content">
  <slot>这是个弹框</slot>
  <div class="footer">
    <button @click="close">close</button>
    <button @click="confirm">confirm</button>
  </div>
</div>

后备内容:当父组件不在插槽里添加内容时,插槽显示的内容。

2.在父组件中使用子组件

在父组件中使用子组件,但不向自定义组件的插槽 slot 中添加内容:

<Modal :visible.sync="visible"></Modal>

此时如果打开弹框,弹框中显示的是后备内容“这是个弹框”:

在这里插入图片描述

在父组件中使用子组件,并给插槽加入个性化内容:

<Modal :visible.sync="visible">个性化内容</Modal>

此时如果打开弹框,弹框中显示的是“个性化内容”:

在这里插入图片描述

弹窗组件

父App.vue

<template>
  <div id="app">
    <button @click="visible = true" class="btn">打开“留言”弹框</button>
    <button @click="visibleApply = true" class="btn">打开“成为大牛”弹框</button>
    <!-- “留言”弹框 -->
    <Modal
      customClassName="textarea-modal"
      title="留言"
      :visible.sync="visible"
      @confirm="confirm"
    >
      <template>
        <div class="txt">留下你想告诉我们的话...</div>
        <textarea
          name=""
          id=""
          cols="30"
          rows="10"
          placeholder="请写下您的宝贵意见"
        ></textarea>
      </template>
    </Modal>
    <!-- “成为大牛”弹框 -->
    <Modal
      customClassName="apply-modal"
      title="成为大牛"
      :visible.sync="visibleApply"
      @confirm="confirm"
    >
      <template>
        <div class="txt">留下联系方式,立即成为大牛</div>
        <div class="mobile">
          <input type="text" placeholder="请输入您的手机号码" />
        </div>
        <div class="code">
          <input type="text" placeholder="请输入验证码" />
          <button class="btn-code">获取验证码</button>
        </div>
      </template>
    </Modal>
  </div>
</template>

<script>
// 引入组件
import Modal from './components/Modal.vue';
export default {
  name: 'app',
  // 注册组件
  components: {
    Modal
  },
  data: function() {
    return {
      // 控制“留言”弹框
      visible: false,
      // 控制“成为大牛”弹框
      visibleApply: false
    };
  },
  methods: {
    // 自定义函数 confirm
    confirm() {
      // todo
    }
  }
};
</script>
<style lang="sCSS">
#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;
}
.btn {
  width: fit-content;
  height: 40px;
  font-size: 15px;
  line-height: 40px;
  box-sizing: border-box;
  cursor: pointer;
  border: none;
  background: #ffffff;
  border: 1px solid #ebebeb;
  color: #1b1b1b;
  padding: 0 20px;
  margin-right: 20px;
  &:focus {
    outline: none;
  }
}
.textarea-modal {
  .txt {
    text-align: left;
    padding-top: 20px;
    font-size: 16px;
    line-height: 22px;
    color: #000000;
  }
  textarea {
    width: 355px;
    height: 110px;
    border: 1px solid #e6e6e6;
    font-size: 16px;
    line-height: 22px;
    color: #000000;
    padding: 14px 20px;
    box-sizing: border-box;
    margin-top: 18px;
    &::placeholder {
      color: rgba(0, 0, 0, 0.2);
    }
    &:focus {
      outline: none;
    }
  }
}
.apply-modal {
  .txt {
    text-align: left;
    padding-top: 20px;
    font-size: 16px;
    line-height: 22px;
    color: #000000;
    margin-bottom: 18px;
  }
  .mobile input,
  .code input {
    width: 355px;
    height: 50px;
    background: #ffffff;
    border: 1px solid #eeeeee;
    font-size: 16px;
    color: #000000;
    padding: 14px 20px;
    box-sizing: border-box;
    &::placeholder {
      color: rgba(0, 0, 0, 0.2);
    }
    &:focus {
      outline: none;
    }
  }
  .code {
    margin-top: 20px;
    position: relative;
    input {
      padding-right: 120px;
    }
    .btn-code {
      height: 50px;
      padding: 0 20px;
      font-size: 14px;
      line-height: 50px;
      color: #2c3744;
      background: none;
      border: none;
      position: absolute;
      top: 0;
      right: 0;
      &:focus {
        outline: none;
      }
      &::before {
        content: '';
        display: block;
        width: 1px;
        height: 20px;
        background: #e5e5e5;
        position: absolute;
        left: 0;
        top: 15px;
      }
    }
  }
}
</style>

子Modal.vue

<template>
  <div :class="['modal', customClassName]" v-if="visible">
    <div class="modal-content">
      <div class="modal-header">
        <div class="title">{{title}}</div>
        <button class="btn-close" @click="close"></button>
      </div>
      <div class="modal-body">
        <slot></slot>
      </div>
      <div class="modal-footer">
        <button class="btn-close" @click="close">取消</button>
        <button class="btn-confirm" @click="confirm">提交</button>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: 'Modal',
  // customClassName 为自定义类名
  // title 为弹框标题
  props: ['visible', 'title', 'customClassName'],
  methods: {
    close() {
      this.$emit('update:visible', false);
    },
    confirm() {
      console.log('confirm');
      this.close();
    }
  }
};
</script>
<style lang="scss" scoped>
.modal {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: rgba(#000, 0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  .modal-content {
    width: 415px;
    background: #fff;
    border-radius: 12px;
    text-align: center;
    .modal-header {
      height: 65px;
      position: relative;
      font-weight: 500;
      font-size: 18px;
      line-height: 65px;
      color: #000000;
      border-bottom: 1px solid #f2f2f2;
      .btn-close {
        width: 16px;
        height: 16px;
        background: url(https://qgt-document.oss-cn-beijing.aliyuncs.com/P3-5-Vue/5/5-1-1.png)
          no-repeat center / contain;
        position: absolute;
        top: 23px;
        right: 30px;
        border: none;
        cursor: pointer;
        &:focus {
          outline: none;
        }
      }
    }
    .modal-body {
      padding: 0 30px;
      font-size: 0;
    }
    .modal-footer {
      padding: 30px;
      display: flex;
      justify-content: space-between;
      .btn-close,
      .btn-confirm {
        width: 125px;
        height: 40px;
        font-size: 15px;
        line-height: 40px;
        box-sizing: border-box;
        cursor: pointer;
        border: none;
        &:focus {
          outline: none;
        }
      }
      .btn-close {
        background: #ffffff;
        border: 1px solid #ebebeb;
        color: #1b1b1b;
      }
      .btn-confirm {
        background: #3ab599;
        color: #fff;
      }
    }
  }
}
</style>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: vue中的slot封装组件弹窗

本文链接: https://lsjlt.com/news/149996.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue中的slot封装组件弹窗
    目录slot封装组件弹窗vue组件slot入门---弹窗组件插槽的基础使用弹窗组件slot封装组件弹窗 <template>   <el-dialog :title...
    99+
    2024-04-02
  • vue中的slot封装组件弹窗怎么实现
    这篇文章主要介绍了vue中的slot封装组件弹窗怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue中的slot封装组件弹窗怎么实现文章都会有所收获,下面我们一起来看看吧。slot封装组件弹窗<t...
    99+
    2023-06-30
  • vue extend+promise封装全局弹窗组件
    本文实例为大家分享了vue extend+promise封装全局弹窗组件的具体代码,供大家参考,具体内容如下 因为项目没有引入第三方UI库,所以所有的公共组件都需要自己封装现在需要一...
    99+
    2024-04-02
  • 在vue3.0中封装button使用slot组件
    目录封装button使用slot组件需求子组件父组件引用vue带你封装一个button创建一个 ShowButton.vue 的组件 新建一个 Button.vue&nbs...
    99+
    2024-04-02
  • 怎么封装一个vue中也可使用的uniapp全局弹窗组件
    这篇文章主要介绍了怎么封装一个vue中也可使用的uniapp全局弹窗组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么封装一个vue中也可使用的uniapp全局弹窗组件文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • vue中怎么封装一个弹出框组件
    这期内容当中小编将会给大家带来有关vue中怎么封装一个弹出框组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.你需要先建一个弹出框的模板://首先创建一个mack.v...
    99+
    2024-04-02
  • vue封装一个弹幕组件详解
    目录前言功能实现1、获取随机颜色随机数生成随机颜色编码生成2、随机生成弹幕出现的高度坐标3、格式化弹幕对象颜色定位4、创建弹幕对象滚动动画定义创建弹幕dom对象实例弹幕销毁弹幕循环5...
    99+
    2022-11-13
    vue封装弹幕组件 vue封装组件
  • vue ant design 封装弹窗表单的使用
    目录vue ant design 封装弹窗表单使用ant-design-vue的Form表单使用脚手架新建项目安装并导入ant-design-vue,使用Form组件启动应用,测试验...
    99+
    2024-04-02
  • vue弹窗组件怎么用
    这篇文章主要为大家展示了“vue弹窗组件怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue弹窗组件怎么用”这篇文章吧。具体...
    99+
    2024-04-02
  • 封装一个vue中也可使用的uniapp的全局弹窗组件(任何页面都可以弹出)
    目录效果图:场景:思路:第一步:第二步:第三部:使用总结效果图: 场景: 当你对接websocket时,或者轮询也好,你需要获取到最新的信息,并且在任何页面弹出一个组件进行后续操作...
    99+
    2023-02-23
    uniapp 全局弹窗 vue弹窗组件 uniapp 全局组件
  • Vue弹窗组件的实现方法
    本文实例为大家分享了Vue弹窗组件的实现具体代码,供大家参考,具体内容如下 弹窗组件包含内容: 弹窗遮罩层内容层的实现(涉及slot、props、$on、$emit) 实现步骤: 1...
    99+
    2024-04-02
  • vue弹窗组件如何使用
    这篇文章给大家分享的是有关vue弹窗组件如何使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例<!DOCTYPE html> <html ...
    99+
    2024-04-02
  • react-native弹窗封装的方法
    本文实例为大家分享了react-native弹窗封装的具体代码,供大家参考,具体内容如下 上图 仿苹果弹窗组件(android+ios均可用) 以上效果均基于本文的弹窗组件,后...
    99+
    2024-04-02
  • vue ant design封装弹窗表单如何使用
    本篇内容介绍了“vue ant design封装弹窗表单如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue a...
    99+
    2023-06-30
  • vue弹窗消息组件怎么用
    这篇文章主要介绍vue弹窗消息组件怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本来打算写一个那种提示完了自动消失的弹窗的,但是没有想好淡入淡出的效果。所以暂时算是半成品。练习...
    99+
    2024-04-02
  • vue的slot组件如何用
    这篇文章主要介绍“vue的slot组件如何用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue的slot组件如何用”文章能帮助大家解决问题。前言slot可以在子组件中开启插槽,在父组件引用该组建时...
    99+
    2023-07-04
  • vue组件化中slot怎么用
    这篇文章将为大家详细讲解有关vue组件化中slot怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言slot可以在子组件中开启插槽,在父组件引用该组建时,可以定义这...
    99+
    2024-04-02
  • vue组件如何封装
    封装vue组件的方法:1.新建vue.js项目;2.使用Vue.extend()方法创建组件;3.使用Vue.component()方法注册组件;4.构建组件变量;5.使用组件名称标签调用组件;具体步骤如下:首先,在vue-cli中创建一个...
    99+
    2024-04-02
  • vue中怎么实现一个toast弹窗组件
    本篇文章给大家分享的是有关vue中怎么实现一个toast弹窗组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先,我们来分析一下弹窗组件的特...
    99+
    2024-04-02
  • React封装弹出框组件的方法
    本文实例为大家分享了React封装弹出框组件的方法,供大家参考,具体内容如下 效果图 文件目录 alertList.tsx 用于容纳弹出框的容器 import React f...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作