利用Vue3封装一个弹框组件简单吗

yizhihongxing

下面是“利用Vue3封装一个弹框组件简单吗”的完整攻略。

步骤一:创建弹框组件

首先,我们需要在Vue3项目中创建一个弹框组件。在这里,我们可以使用createApp来创建一个Vue实例,并通过template的方式创建组件视图。同时,我们还需要在弹框组件中实现以下功能:

  • 在组件外部调用 show() 方法可以展示弹框;
  • 在组件外部调用 hide() 方法可以隐藏弹框;
  • 可以自定义弹框大小、显示位置等样式。

以下是一个简单的弹框组件示例代码:

<template>
  <transition name="fade">
    <div class="dialog" v-if="visible">
      <div class="dialog-overlay" @click="handleClickOutside"></div>
      <div class="dialog-wrapper" :style="styles">
        <div class="dialog-header">{{ title }}</div>
        <div class="dialog-body">{{ content }}</div>
        <div class="dialog-footer">
          <button class="dialog-btn" @click="hide()">取消</button>
          <button class="dialog-btn confirm" @click="confirm()">确定</button>
        </div>
      </div>
    </div>
  </transition>
</template>

<script>
import { ref, onMounted, onUnmounted } from 'vue'

export default {
  name: 'Dialog',
  props: {
    title: String,
    content: String,
    width: {
      type: String,
      default: '400px'
    },
    height: {
      type: String,
      default: 'auto'
    },
    showMask: {
      type: Boolean,
      default: true
    },
    onConfirm: Function,
    onCancel: {
      type: Function,
      default () {
        this.hide()
      }
    }
  },
  setup (props) {
    const visible = ref(false)

    const styles = {
      width: props.width,
      height: props.height
    }

    const handleClickOutside = () => {
      if (props.showMask) {
        props.onCancel()
      }
    }

    const show = () => {
      visible.value = true
    }

    const hide = () => {
      visible.value = false
    }

    const confirm = () => {
      props.onConfirm()
      hide()
    }

    onMounted(() => {
      document.addEventListener('keydown', handleEscKey)
    })

    onUnmounted(() => {
      document.removeEventListener('keydown', handleEscKey)
    })

    const handleEscKey = (event) => {
      if (event.key === 'Escape') {
        hide()
      }
    }

    return {
      visible,
      styles,
      handleClickOutside,
      show,
      hide,
      confirm
    }
  }
}
</script>

<style scoped>
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.3s;
}

.fade-enter, .fade-leave-to {
  opacity: 0;
}

.dialog {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

.dialog-overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, .5);
}

.dialog-wrapper {
  background-color: #fff;
  border-radius: 4px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, .3);
  overflow: hidden;
}

.dialog-header, .dialog-footer {
  padding: 16px;
  background-color: #f3f4f5;
  text-align: center;
  font-size: 18px;
  font-weight: 500;
}

.dialog-body {
  padding: 16px;
  font-size: 14px;
  line-height: 1.5;
  color: #606266;
}

.dialog-btn {
  display: inline-block;
  border: none;
  outline: none;
  padding: 8px 16px;
  margin-right: 10px;
  font-size: 14px;
  font-weight: 500;
  background-color: #f3f4f5;
  border-radius: 4px;
  cursor: pointer;
  transition: background-color .3s;
}

.dialog-btn:hover {
  background-color: #e4e5e6;
}

.confirm {
  background-color: #409eff;
  color: #fff;
}

.confirm:hover {
  background-color: #66b1ff;
}
</style>

步骤二:使用弹框组件

在创建完弹框组件之后,就可以在需要使用弹框的地方直接引入并使用组件了。以下是示例代码:

<template>
  <div>
    <button @click="showDialog">打开弹框</button>
    <!-- 弹框组件 -->
    <Dialog
      ref="dialog"
      :title="title"
      :content="content"
      :width="width"
      :height="height"
      :on-confirm="handleConfirm"
      :on-cancel="handleCancel"
    />
  </div>
</template>

<script>
import { ref } from 'vue'
import Dialog from './Dialog.vue'

export default {
  name: 'MyComponent',
  components: {
    Dialog
  },
  setup () {
    const title = '提示'
    const content = '这是一个弹框!'
    const width = '400px'
    const height = 'auto'

    const dialog = ref(null)

    const showDialog = () => {
      dialog.value.show()
    }

    const handleConfirm = () => {
      alert('您点击了确定按钮!')
    }

    const handleCancel = () => {
      alert('您点击了取消按钮!')
    }

    return {
      title,
      content,
      width,
      height,
      dialog,
      showDialog,
      handleConfirm,
      handleCancel
    }
  }
}
</script>

以上示例代码展示了如何在一个Vue组件中使用弹框组件。具体来说,当点击“打开弹框”按钮时,会调用showDialog()方法,并显示弹框。弹框的相关参数,比如标题、内容、宽度和高度等,都可以在Vue组件中动态设置。当用户点击弹框的“确定”或“取消”按钮时,会触发handleConfirm()handleCancel()方法,从而执行相应的逻辑。

到此为止,Vue3封装一个弹框组件的攻略就结束了。希望可以对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用Vue3封装一个弹框组件简单吗 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • iPhone重启和关机有什么不同 强制重启和关机后再开机区别介绍

    iPhone重启和关机有什么不同 在日常使用中,iPhone重启和关机都是经常需要操作的,但是它们之间还是有一些不同的。简单来说,关机意味着完全关闭iPhone,而重启则是让iPhone重新启动。 关机的意义 关机可以关闭iPhone上的应用程序、停止所有的后台进程,并且关闭所有的WiFi、移动数据等网络功能,完全让iPhone处于无电源状态。 如果你长时间…

    other 2023年6月26日
    00
  • Win8自定义个性锁屏壁纸就是Win键+L锁屏时的画面

    Win8自定义个性锁屏壁纸需要以下步骤: 1. 准备壁纸图片 首先要准备一张符合个人喜好的图片作为锁屏壁纸,可以通过搜索引擎或者自己拍摄获取。请注意,图片需要满足以下规范: 建议大小为1920 x 1080像素; 不得包含色情、暴力、政治等敏感内容; 图片格式只支持JPG、JPEG、GIF、BMP、PNG格式。 2. 修改注册表 打开运行对话框,按下Win+…

    other 2023年6月25日
    00
  • nodemanager概述(基本职能和内部架构)

    当然,我很乐意为您提供有关“nodemanager概述(基本职能和内部架构)”的完整攻略。以下是详细的步骤和两个示例: 1 nodemanager概述 NodeManager是Apache Hadoop YARN的一个组件,它的主要职能是管理和监控YARN节点上的资源。NodeManager负责启动和停止容器,监控容器的资源使用情况,并向ResourceMa…

    other 2023年5月6日
    00
  • 用matlab实现字符串分割(split)

    以下是“用Matlab实现字符串分割(split)”的完整攻略: 用Matlab实现字符串分割(split) 在Matlab中,您使用“split”函数将字符串分割成单词子字符串。以下是使用Matlab实现字符串分割的步骤: 准备字符串。 在进行字符串分割之前,您需要准备一个。以下是一个示例: matlab str = “Hello, World!”; 在上…

    other 2023年5月7日
    00
  • C++ 实现单链表创建、插入和删除

    C++ 实现单链表创建、插入和删除的攻略如下: 创建单链表 创建一个单链表需要先定义一个链表节点结构体,包含两个元素:一个是节点的值,另一个是指向下一个节点的指针。 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 定义好节点结构体之后,…

    other 2023年6月27日
    00
  • 一起学vue:crud(增删改查)

    一起学 Vue:CRUD(增删改查) 在 web 开发中,CRUD 是最基础的操作之一,它即增加、查询、更新和删除(Create, Read, Update 和 Delete)数据操作。本文将带领大家学习 Vue.js 如何实现 CRUD 操作。 前置知识 在开始学习 Vue.js 中 CRUD 的实现,需要先掌握 Vue.js 基础知识,具体包括: Vue…

    其他 2023年3月29日
    00
  • linux查看服务器开放的端口和启用的端口多种方式

    需要查看Linux服务器上已开放和启用的端口,可以使用以下多种方式: 方式 1:使用 netstat 命令查看端口状态 打开终端,输入以下命令来查看服务器开放的所有端口的状态: netstat -an 输出结果中,所有的端口都会显示其状态(Listening、Established、Closed、等等)。 如果想要查看特定端口的状态,可以使用: netsta…

    other 2023年6月27日
    00
  • 绝地求生刺激战场手机显示模拟器登录怎么解决 模拟器登录解决方法

    绝地求生刺激战场手机显示模拟器登录解决方法 背景 绝地求生刺激战场(PUBG Mobile)是一款热门的手机游戏,但是某些玩家可能希望使用PC模拟器进行游戏,以获得更好的游戏体验和更高的操作体验。然而,有些玩家可能会在使用模拟器时遇到“模拟器登录”的问题,导致无法进入游戏。本文将介绍如何解决绝地求生刺激战场手机显示模拟器登录的问题。 解决方法 方法一:更改模…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部