当前位置: 首页 > news >正文

Vue3+Ts封装类似el-drawer的抽屉组件

提供9个字段对drawer组件进行控制:

  • modelValue: 对抽屉显示隐藏进行控制,

  • width: 控制抽屉的宽度,

  • title: 控制抽屉的标题,

  • appendToBody: 是否将抽屉添加至body,

  • closeOnClickModal: 是否点击遮罩层关闭抽屉,

  • showConfirm: 是否显示确认按钮,

  • showCancel: 是否显示取消按钮,

  • cancelText: 取消按钮的文本,

  • confirmText: 确认按钮的文本

drawer.vue代码如下

<template><teleport v-if="appendToBody" to="body"><transition name="drawer-fade"><div v-show="visible" class="drawer-overlay" @click.self="handleCloseModal"><div class="drawer-content" :style="drawerStyle" @click.stop><div class="drawer-header"><div class="title-content"><div class="drawer-close-button" @click="handleClose">X</div><span>{{ title }}</span></div><div class="drawer-btn"><div v-if="showCancel" class="drawer-button" @click="handleCancel">{{ cancelText }}</div><div v-if="showConfirm" class="drawer-button" @click="handleSure">{{ confirmText }}</div></div></div><div class="mes-drawer-layout-main"><slot></slot></div></div></div></transition></teleport><transition name="drawer-fade" v-else><div v-show="visible" class="drawer-overlay" @click.self="handleCloseModal"><div class="drawer-content" :style="drawerStyle" @click.stop><div class="drawer-header"><div class="title-content"><div class="drawer-close-button" @click="handleClose">X</div><span>{{ title }}</span></div><div class="drawer-btn"><div v-if="showCancel" class="drawer-button" @click="handleCancel">{{ cancelText }}</div><div v-if="showConfirm" class="drawer-button" @click="handleSure">{{ confirmText }}</div></div></div><div class="mes-drawer-layout-main"><slot></slot></div></div></div></transition>
</template><script lang="ts" setup>
import { ref, watch, computed } from "vue";
const props = withDefaults(defineProps<{modelValue?: boolean;width?: string;title?: string;appendToBody?: boolean;closeOnClickModal?: boolean;showConfirm?: boolean;showCancel?: boolean;cancelText?: string;confirmText?: string;}>(),{modelValue: false,width: "30%",title: "",appendToBody: true,closeOnClickModal: false,showConfirm: true,showCancel: true,cancelText: "取消",confirmText: "确认"}
);const emit = defineEmits<{(event: "update:modelValue", value: boolean): void;(event: "beforeClose"): void;(event: "on-cancel"): void;(event: "on-sure"): void;
}>();const visible = ref(props.modelValue);watch(() => props.modelValue,newVal => {visible.value = newVal;}
);const drawerStyle = computed(() => ({width: props.width,height: "100%"
}));function handleCloseModal() {if (props.closeOnClickModal) {handleClose();}
}function handleClose() {emit("beforeClose");emit("update:modelValue", false);
}function handleCancel() {emit("on-cancel");
}function handleSure() {emit("on-sure");
}
</script><style lang="scss" scoped>
.drawer-overlay {z-index: 999;position: fixed;top: 0;right: 0;bottom: 0;left: 0;background-color: rgba(0, 0, 0, 0.5);display: flex;justify-content: flex-end;align-items: center;.drawer-content {background: #333333;box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);transition: transform 0.3s ease;position: relative;z-index: 1000;display: flex;flex-direction: column;.drawer-header {display: flex;align-items: center;justify-content: space-between;height: 56px;padding: 0 16px;border-bottom: 1px solid #efefef;color: #ffffff;.title-content {display: flex;align-items: center;span {margin-left: 12px;}.drawer-close-button {font-size: 16px;cursor: pointer;}}.drawer-btn {display: flex;justify-content: flex-end;padding: 10px;.drawer-button {margin-left: 10px;display: inline-flex;justify-content: center;align-items: center;line-height: 1;height: 32px;white-space: nowrap;cursor: pointer;color: #fff;text-align: center;box-sizing: border-box;outline: 0;transition: 0.1s;font-weight: 500;-webkit-user-select: none;user-select: none;vertical-align: middle;-webkit-appearance: none;background-color: #2478f2;border: 1px solid #dcdfe6;border-color: #2478f2;padding: 8px 15px;font-size: 14px;border-radius: 4px;}}}.mes-drawer-layout-main {padding: 16px;box-sizing: border-box;flex: 1;color: #ffffff;}}
}
</style><style>
.drawer-fade-enter-active,
.drawer-fade-leave-active {transition: opacity 0.3s ease;
}.drawer-fade-enter,
.drawer-fade-leave-to {opacity: 0;
}
</style>

 使用方式:

<template><Drawerv-model="showDrawer"width="500px"title="抽屉"@before-close="drawerBeforeClose"@on-sure="handleDrawerSure"@on-cancel="handleDrawerCancel"><p>This is the drawer content</p></Drawer>
</template><script setup lang="ts">
import { ref } from "vue";
import Drawer from "@/components/Drawer/index.vue";
const showDrawer = ref(false);
const handleShowDetails = () => {console.log("跳转到详情页");showDrawer.value = true;
};
const drawerBeforeClose = () => {console.log("抽屉关闭前");showDrawer.value = false;
};
const handleDrawerSure = () => {console.log("抽屉确认");showDrawer.value = false;
};
const handleDrawerCancel = () => {console.log("抽屉取消");showDrawer.value = false;
};</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C语言篇】编译和链接以及预处理介绍(下篇)
  • springboot controller参数中如何传递字符串数组
  • MySQL 常用 SQL 语句大全
  • LVS的简单配置及对Mysql主从复制的补充
  • 食品零食小吃商城管理系统-计算机毕设Java|springboot实战项目
  • 求职Leetcode算法题(7)
  • c语言基础知识学习
  • 井字棋游戏(HTML+CSS+JavaScript)
  • Java的反射原理
  • 天途推出无人机软硬件定制服务
  • Velero 快速上手:使用 Velero 实现 Kubernetes 集群备份与迁移
  • Java设计模式-责任链模式
  • 酷炫时尚未来科技视频开头PR模板MOGRT
  • zabbix的setup无法进入第二步
  • 单细胞irGSEA分析:整合多种富集分析方式的R包
  • 2017-08-04 前端日报
  • angular组件开发
  • const let
  • Docker: 容器互访的三种方式
  • Gradle 5.0 正式版发布
  • httpie使用详解
  • java中具有继承关系的类及其对象初始化顺序
  • spark本地环境的搭建到运行第一个spark程序
  • SpiderData 2019年2月25日 DApp数据排行榜
  • ucore操作系统实验笔记 - 重新理解中断
  • webgl (原生)基础入门指南【一】
  • 关于springcloud Gateway中的限流
  • 今年的LC3大会没了?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 提醒我喝水chrome插件开发指南
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • raise 与 raise ... from 的区别
  • scrapy中间件源码分析及常用中间件大全
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • #if等命令的学习
  • $refs 、$nextTic、动态组件、name的使用
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (算法)N皇后问题
  • (转载)深入super,看Python如何解决钻石继承难题
  • *** 2003
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET 材料检测系统崩溃分析
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .Net6使用WebSocket与前端进行通信
  • .net中调用windows performance记录性能信息
  • .net专家(高海东的专栏)
  • ::前边啥也没有
  • @property python知乎_Python3基础之:property