Vue-函数式组件

最近在开发项目的时候,定制了一个公司内部样式的Modal模态框组件。

Modal组件伪代码

<!-- Modal/index.vue-->
<template>
  <div class="modal-container" id="modalContainer">
    <!-- Modal Content -->
    <div class="modal-content">
      <!-- Close Button -->
      <span class="modal-close" @click="props.cancel">&times;</span>

      <!-- Modal Header -->
      <div class="modal-header">{{ props.title }}</div>

      <!-- Modal Body -->
      <div class="modal-body">
        <p>{{ props.content }}</p>
      </div>

      <!-- Modal Footer -->
      <div class="modal-footer">
        <button class="button secondary" @click="props.cancel">{{ props.cancelButtonText }}</button>
        <button class="button primary" @click="props.confirm">{{ props.confirmButtonText }}</button>
      </div>
    </div>
  </div>
</template>

<script setup name="Modal">
  const props = defineProps({
    title: {
      type: String,
      default: 'Modal Title',
    },
    content: {
      type: String,
      default: 'This is the modal content.',
    },
    confirmButtonText: {
      type: String,
      default: 'Confirm',
    },
    cancelButtonText: {
      type: String,
      default: 'Cancel',
    },
    confirm: {
      type: Function,
      default: () => {},
    },
    cancel: {
      type: Function,
      default: () => {},
    },
  })
</script>

<style scoped>
.modal-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 999;
}

/* Styles for the modal content */
.modal-content {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background-color: #fff;
  padding: 20px;
  border-radius: 4px;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
  width: 300px;
}

/* Styles for the close button */
.modal-close {
  position: absolute;
  top: 10px;
  right: 10px;
  cursor: pointer;
}

/* Styles for the modal header */
.modal-header {
  font-weight: bold;
  margin-bottom: 10px;
}

/* Styles for the modal body */
.modal-body {
  margin-bottom: 20px;
}

/* Styles for the modal footer */
.modal-footer {
  text-align: right;
}

/* Example styles for buttons */
.button {
  padding: 8px 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

.primary {
  background-color: #1890ff;
  color: #fff;
}

.secondary {
  background-color: #ccc;
}
</style>

使用组件

<template>
 <button @click="toggleModal">Show Modal</button>
  <Modal v-if="modalVisible" v-bind="modalProps"></Modal>
</template>

<script setup>
  import { ref } from 'vue'
  import Modal from '../components/Modal/index.vue'

  const modalProps = {
    title: '弹窗标题',
    content: '弹窗内容,弹窗内容',
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    confirm() {
      console.log('confirm')
      toggleModal()
    },
    cancel() {
      console.log('cancel')
      toggleModal()
    }
  }
  const modalVisible = ref(false)

  function toggleModal() {
    modalVisible.value = !modalVisible.value
  }
</script>

调用成功
在这里插入图片描述

改造支持函数形式调用

由于使用频率很高,每次都引入组件再使用略显麻烦,于是决定改造一下,支持函数调用该Modal组件

  1. 新建js文件,导入Modal.vue(单文件组件实际上是一个JS对象)
  2. 使用vue提供的createApp实例化Modal.vue组件,第一个参数是组件,第二个参数是传递给组件的props
  3. 创建一个div标签并插入body,调用modal实例下的mount方法挂载到div上。
  4. 销毁Modal:调用unmount方法并移除div元素
// Modal/index.js
import { createApp } from 'vue'
import Modal from './index.vue'

export function showModal(props = {}) {
  // 创建一个div并插入body
  const div = document.createElement('div')
  document.body.appendChild(div)

  // 创建一个modal实例
  const modal = createApp(Modal, {
    ...props,
    // 劫持取消事件,卸载组件
    cancel() {
      props.cancel()
      unMount()
    },
    // 劫持确认事件,卸载组件
    confirm() {
      props.confirm()
      unMount()
    }
  })
  // 挂载到div上
  modal.mount(div)

  // 卸载组件
  function unMount() {
    modal.unmount()
    div.remove()
  }
}

函数式调用

<template>
  <div>函数式调用:<button @click="handleClick">Show Modal</button></div>
</template>

<script setup name="FunctionComponent">
  import { showModal } from '../components/Modal';

  const modalProps = {
    title: '弹窗标题',
    content: '弹窗内容,弹窗内容',
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    confirm() {
      console.log('confirm')
    },
    cancel() {
      console.log('cancel')
    }
  }

  // 函数式调用
  function handleClick() {
    showModal(modalProps)
  }
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux-MySQL的数据目录

总结&#xff1a; window中的my.ini linux 中 /etc/my.cnfwindow中的D:\soft\mysql-5.7.35-winx64\data linux 中 /var/lib/mysql 1.查找与mysql有关的目录 find / -name mysql [rootVM-4-6-centos etc]# find / -name mysql /opt/mysql /etc/selinux/targeted/tmp/modul…

(4)(4.4) 使用测试版和开发版

文章目录 4.4 使用测试版和开发版 4.4.1 测试版 4.4.2 最新开发版本 4.4.3 自定义固件构建服务器 4.4.4 固件的局限性 4.5 测试 4.4 使用测试版和开发版 4.4.1 测试版 在稳定版(Stable)发布之前&#xff0c;会发布测试版(Beta)。如果你想尝试较新的功能或帮助开发人员飞行…

The Battle of Chibi

题目链接 题意&#xff1a;在n个数的数组中找m个数的严格递增子序列 思路&#xff1a;动态规划dp[i][j]代表以a[i]结尾并且长度为j的子序列方案数 则有状态转移方程&#xff1a; 其中a[i]<1e9&#xff0c;而数组并不能开这么大&#xff0c;所以考虑离散化 离散化后的状态转移…

AutoSAR系列讲解(实践篇)11.6-服务映射(自顶向下)

目录 一、配置Service Needs 二、配置Cfg同步 我们在下一节的实验课中讲解这里的具体配置流程,本节主要讲一下这些配置的大致流程和配置项的作用。NvBlockSwComponents是一个可选项, 我们这里开始不使用NvBlockSwComponents,将我们的Application SWC直接和NvM通过C/S连接起…

荐读 | 《揭秘云计算与大数据》

当我们回顾过去几十年的科技进步时&#xff0c;云计算和大数据在现代科技发展史上无疑具有里程碑式的意义&#xff0c;它们不仅改变了我们的生活方式&#xff0c;而且对各行各业产生了深远的影响。 在这个数字化时代&#xff0c;云计算和大数据技术已经成为推动全球发展的关键…

python 将excel 多行进行分组合并

def exc():"""# 需要用到分组的概念:将角色和业务单据的进行分组,结果合并为一行"""df pd.read_excel(test33.xlsx)# 设置需要分组的字段cols [姓名, 科目]#agg() 其中的参数字段为之后输出的表格中的列字段df df.groupby(cols).agg({姓名: f…

JSP--Java的服务器页面

jsp是什么&#xff1f; jsp的全称是Java server pages,翻译过来就是java的服务器页面。 jsp有什么作用&#xff1f; jsp的主要作用是代替Servlet程序回传html页面的数据&#xff0c;因为Servlet程序回传html页面数据是一件非常繁琐的事情&#xff0c;开发成本和维护成本都非常高…

Stable Diffusion VAE:改善图像质量的原理、选型与使用指南

VAE Stable Diffusion&#xff08;稳定扩散&#xff09;是一种用于生成模型的算法&#xff0c;结合了变分自编码器&#xff08;Variational Autoencoder&#xff0c;VAE&#xff09;和扩散生成网络&#xff08;Diffusion Generative Network&#xff09;的思想。它通过对变分自…

vue2-v-show和v-if有什么区别,使用场景分别是什么?

1、v-show和v-if的共同点 在vue中&#xff0c;v-if和v-show的作用效果是相同的&#xff08;不含v-else&#xff09;&#xff0c;都能控制元素在页面是否显示&#xff0c;在用法上也相同。 当表达式为true的时候&#xff0c;都会占据页面的位置 当表达式为false的时候&#xff…

如果网站用了CDN,我怎么找到它的真实IP?

0x01 验证是否存在CDN 方法1&#xff1a; 很简单&#xff0c;使用各种多地 ping 的服务&#xff0c;查看对应 IP 地址是否唯一&#xff0c;如果不唯一多半是使用了CDN&#xff0c; 多地 Ping 网站有&#xff1a; http://ping.chinaz.com/ http://ping.aizhan.com/ http://ce.…

windows部署springboot项目 jar项目 (带日志监听和开机自起脚本)

windows部署springboot项目 jar项目 &#xff08;带日志监听&#xff09; 1.把项目打包成jar包&#xff0c;本例演示打包后的jar文件名为demo.jar ———————————————— 2.需要装好java环境&#xff0c;配置好JAVA_HOME&#xff0c;CLASSPATH&#xff0c;PATH等…

[腾讯云Cloud Studio实战训练营]无门槛使用GPT+Cloud Studio辅助编程完成Excel自动工资结算

目录 前言一、Cloud Studio产品介绍1.1 注册Cloud Studio 二、项目实验2.1 选择合适的开发环境2.2 实验项目介绍2.3 实验步骤三、总结 前言 chatgpt简单介绍: ChatGPT是一种基于GPT的自然语言处理模型&#xff0c;专门用于生成对话式文本。它是OpenAI于2021年发布的&#xff0…

海外应用商店优化实用指南之关键词

和SEO一样&#xff0c;关键词是ASO中的一个重要因素。就像应用程序标题一样&#xff0c;在Apple App Store和Google Play中处理应用程序关键字的方式也有所不同。 关键词研究。 对于Apple&#xff0c;我们的所有关键词只能获得100个字符&#xff0c;Google Play没有特定的关键…

CS 144 Lab Four -- the TCP connection

CS 144 Lab Four -- the TCP connection TCPConnection 简述TCP 状态图代码实现完整流程追踪 测试 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Four 对应的PDF: Lab Checkpoint 4: down the stack (the network interface) TCPConnection 简述 TCPConnection 需要…

abp vnext升级到指定版本并处理升级后的问题

在使用abp vnext时当版本更新后可能会跨越net的版本&#xff0c;如果我们想升级到指定版本该怎么做呢&#xff0c;升级之后又有一些问题需要处理&#xff0c;下面一起看一下&#xff1a; 当前我的项目是.net5 abp vnext4.2.1 当前的最新abp版本是7.* 对应的net版本是 net7,由于…

flutter:二维码生成与读取

前言 这csdn真的是服了&#xff0c;图片里有个二维码就直接变成违规图片了。至于效果的话&#xff0c;自己运行一下看看吧。 生成 flutter中生成二维码可以使用 qr_flutter。 官方文档 https://pub-web.flutter-io.cn/packages/qr_flutter 安装 flutter pub add qr_flutt…

Java项目乱码几种情况

1.前端界面问题 在head标签里看是否有编码设置 <meta http-equiv"Content-Type" content"text/html; charsetutf-8" />2.浏览器端Tomcat乱码 在该界面加入 -Dfile.encodingUTF-8

代码随想录算法训练营day24 | 回溯问题,77. 组合

目录 回溯问题 77. 组合 回溯问题 回溯模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯…

支付宝蜻蜓设备abs调试

蜻蜓设备系统日志调试 1、蜻蜓设备进入开发者模式 长按关键键直到屏幕上出现设置按钮&#xff0c;点击设置按钮&#xff0c;选择关于本机&#xff0c;找到系统版本&#xff0c;连续点击8次&#xff0c;选择进入调试模式 2、找到小程序容器&#xff0c;连续点击8次&#xff0…

WebGL: 几个入门小例子

本文罗列几个WebGL入门例子&#xff0c;用于帮助WebGL学习。 一、概述 WebGL (Web Graphics Library)是一组基于Open ES、在Web内渲染3D图形的Javascript APIs。 Ref. from Khronos Group: WebGL WebGL™ is a cross-platform, royalty-free open web standard for a low-lev…