Vue组件封装之dialog对话框组件详解

 更新时间:2024年05月24日 09:12:49   作者:黑猫了个怪怪  
这篇文章主要介绍了Vue组件封装之dialog对话框组件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、基础准备工作

1、创建一个基础的vue项目包

2、创建components文件夹,用于存放组件,新建dialog.vue组件,可以自己取个名字

<script>
export default {
  name: "CatDialog",
};
</script>

3、在main.js中引入组件

import CatDialog from "./components/dialog.vue";
Vue.component(CatDialog.name, CatDialog);

4、App.vue中使用组件

二、dialog组件结构搭建

dialog对话框,整体有一个动画效果,vue的动画效果,使用transition包裹需要动画展示的元素,那么这个元素在显示/隐藏时自动添加一些类名,此例详见后续代码

对话框分为三部分:

1、头部:左侧为标题,使用具名插槽 title 占位,右侧为按钮/图标(关闭)

2、主体内容,使用不具名的插槽占位

3、底部:一般都是一些操作,使用具名插槽 footer 占位,通常内容是取消/确认按钮

需要传入的参数:

  • title:头部标题
  • width:对话框宽度
  • top:对话框距离顶部的距离
  • visible:对话框的显示/隐藏

页面效果:

dialog.vue 具体代码如下,style样式太多,不逐一列出了,可根据需求自己定义:

<template>
  <transition name="dialog-fade">
    <!--self:事件修饰符,只有点击自己才触发,点击子元素不触发  -->
    <div class="cat-dialog__wrapper" v-show="visible" @click.self="handleClose">
      <!-- 对话框 -->
      <div class="cat-dialog" :style="{ width, marginTop: top }">
 
        <!-- 对话框顶部 标题 + 关闭按钮 -->
        <div class="cat-dialog__header">
          <slot name="title">
            <span class="cat-dialog__title">{{ title }}</span>
          </slot>
          <button class="cat-dialog__headerbtn" @click="handleClose">
            <i class="cat-icon-close"></i>
          </button>
        </div>
 
        <!-- 对话框内容 -->
        <div class="cat-dialog__body">
          <slot></slot>
        </div>
 
        <!-- 对话框底部 一般都是一些操作,没有传入footer插槽就不显示v-if -->
        <div class="cat-dialog__footer" v-if="$slots.footer">
          <slot name="footer"></slot>
        </div>
      </div>
    </div>
  </transition>
</template>
<script>
export default {
  name: "CatDialog",
  props: {
    title: {
      type: String,
      default: "提示",
    },
    // 弹框宽度
    width: {
      type: String,
      default: "30%",
    },
    // 弹框距离顶部距离
    top: {
      type: String,
      default: "15vh",
    },
    visible: {
      type: Boolean,
      default: false,
    },
  },
  methods: {
    handleClose() {
      //visible是父组件传过来的props,子组件不能直接修改,需要子传父
      this.$emit("update:visible", false);
    },
  },
};
</script>

transition动画代码:

<style lang="scss">
// 进入动画
.dialog-fade-enter-active {
  animation: dialog-fade-in 0.4s;
}
// 离开动画
.dialog-fade-leave-active {
  animation: dialog-fade-out 0.4s;
}
 
@keyframes dialog-fade-in {
  0% {
    transform: translate3d(0, -20px, 0);
    opacity: 0;
  }
  100% {
    transform: translate3d(0, 0, 0);
    opacity: 1;
  }
}
 
@keyframes dialog-fade-out {
  0% {
    transform: translate3d(0, 0, 0);
    opacity: 1;
  }
  100% {
    transform: translate3d(0, -20px, 0);
    opacity: 0;
  }
}
</style>

App.vue使用dialog组件:

<template>
  <div>
    <Cat-button type="primary" @click="visible = true">点击弹出</Cat-button>
    <!-- 
      sync:事件修饰符,是一个语法糖写法,实现子组件修改父组件传入的props
      父:visible.sync="visible"
      子:this.$emit("update:visible", false) 
    -->
    <Cat-dialog width="25%" top="100px" :visible.sync="visible">
      <template v-slot:title>
        <h3>标题</h3>
      </template>
      <template>
        <p>主体内容,随便写点什么...</p>
        <input type="text" placeholder="请输入信息" />
      </template>
      <template v-slot:footer>
        <Cat-button @click="visible = false">取消</Cat-button>
        <Cat-button type="primary" @click="visible = false">确定</Cat-button>
      </template>
    </Cat-dialog>
  </div>
</template>
<script>
export default {
  data() {
    return {
      visible: false,
    };
  },
};
</script>
<style lang="scss" scoped>
.cat-button {
  margin-right: 10px !important;
}
</style>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue注册模块与登录状态的持久化实现方法详解

    Vue注册模块与登录状态的持久化实现方法详解

    这篇文章主要介绍了Vue注册模块与登录状态的持久化实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 解决vue-router 切换tab标签关闭时缓存问题

    解决vue-router 切换tab标签关闭时缓存问题

    这篇文章主要介绍了解决vue-router 切换tab标签关闭时缓存问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • VUE动态生成word的实现

    VUE动态生成word的实现

    这篇文章主要介绍了VUE动态生成word的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue.js中v-on:textInput无法执行事件问题的解决过程

    vue.js中v-on:textInput无法执行事件问题的解决过程

    大家都知道vue.js通过v-on完成事件处理与绑定,但最近使用v-on的时候遇到了一个问题,所以下面这篇文章主要给大家介绍了关于vue.js中v-on:textInput无法执行事件问题的解决过程,需要的朋友可以参考下。
    2017-07-07
  • vue3中关于i18n字符串转义问题

    vue3中关于i18n字符串转义问题

    这篇文章主要介绍了vue3中关于i18n字符串转义问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Vue数组根据对象属性去重和数组对象去重实现方式

    Vue数组根据对象属性去重和数组对象去重实现方式

    文章介绍了两种去重方法:一种是根据对象的`id`属性去重,另一种是根据`id`和`name`属性去重,通过`map()`和`filter()`方法结合`indexOf()`实现去重
    2025-12-12
  • Vue 3.x+axios跨域方案的踩坑指南

    Vue 3.x+axios跨域方案的踩坑指南

    这篇文章主要给大家介绍了关于Vue 3.x+axios跨域方案的踩坑指南,文中通过示例代码介绍的非常详细,对大家学习或者使用Vue 3.x具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • vue3清空let arr=reactive([])的方式

    vue3清空let arr=reactive([])的方式

    这篇文章主要介绍了vue3清空let arr=reactive([])的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • vue3+element-plus 实现动态菜单和动态路由的渲染的项目实践

    vue3+element-plus 实现动态菜单和动态路由的渲染的项目实践

    本文主要介绍了vue3+element-plus 实现动态菜单和动态路由的渲染的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • Vue中@click.stop与@click.prevent、@click.native使用

    Vue中@click.stop与@click.prevent、@click.native使用

    这篇文章主要介绍了Vue中@click.stop与@click.prevent、@click.native使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论