Vue小技巧-公共组件开发

2023-11-14

我们会遇到很多类似于这样的场景,公共组件弹窗,点击确定/取消按钮会执行某个函数。一般做法是同props把弹窗一些value,function注入进去,然后子组件emit执行一下,但是这样有一个问题,就是太麻烦了。本文通过动态挂载组件的 方式去解决这个需求,废话少说,直接上代码。

项目结构:

在这里插入图片描述
首先,我们先封装一下动态挂载方法:
mountComponent.ts

import { App, Component, createApp } from 'vue'

function isInDocument(element: HTMLElement) {
    return document.body.contains(element)
}

export function mountComponent(RootComponent: Component, className: string, singleton?: boolean) {
    const root = document.createElement('div')
    root.className = (className || '') + '-wrap'

    const app: App<Element> = createApp(RootComponent)
    const instance: any = app.mount(root)

    if (singleton) {
        if (!isInDocument(root)) {
            document.body.appendChild(root)
        } else {
            document.body.appendChild(root)
        } 
    }    

    return {
        instance,
        unmount() {
            try {
                app.unmount()
            } catch(err) {
                console.log(err)
            }
        }
    }
}

然后,我们定义一个公共组件:
modal/index.vue
注意:当时我尝试用setup那种写法时,我发现数据注入不进去,因为时间关系,没去找原因,如果大佬知道的话,记得告诉下我。必须return这些定义好的value和function,否则数据无法注入。

<template>
    <div v-show="show" class="modal">
        <div v-show="title">{{ title }}</div>
        <div v-show="message">{{ message }}</div>
        <div>
            <button v-show="showConfirmBtn" @click="confirm">确认</button>
            <button v-show="showCancelBtn" @click="cancel">取消</button>
        </div>
    </div>
</template>

<script lang="ts" >
import { ref, defineComponent } from 'vue'

export default defineComponent({
    name: 'modal',
    setup() {
        const show = ref(false)
        const message = ref('')
        const title = ref('')
        const showConfirmBtn = ref(true)
        const showCancelBtn = ref(true)
        const callback = ref<(action: string) => void>(() => {})

        const close = (action: string) => {
            setTimeout(() => {
                //show.value = false
                console.log('执行回调哈桑农户')
                callback.value(action)
            }, 500);
        }

        const confirm = () => {
            close('confirm')
        }

        const cancel = () => {
            close('cancel')
        }
        return {
            show,
            message,
            title,
            callback,
            close,
            showConfirmBtn,
            showCancelBtn,
            confirm,
            cancel
        }
    }
})
</script>

<style>

.modal {
    position: fixed;
}

</style>

最关键的代码来了
modal/index.ts

import { mountComponent } from '@/util/mountComponent'
import modal from './index.vue'

interface ModalInstance {
    instance: any
    unmount: () => void
}

let modalInstance: ModalInstance

export interface ModalOptions {
    show?: boolean
    title?: string
    message?: string
    showConfirmBtn?: boolean
    showCancelBtn?: boolean
    callback?: (action: string) => void
}

function createInstance() {
    if (modalInstance) {
        return modalInstance
    }
    modalInstance = mountComponent(modal, 'modal', true)
    return modalInstance
}

Modal.defaultOptions = {
    show: false,
    title: '',
    message: '',
    showConfirmBtn: true,
    showCancelBtn:  true,
    callback: (action: string) => {
        modalInstance?.instance[action === 'confirm' ? 'resolve' : 'reject'](action)
    }
}

function Modal(options: ModalOptions) {
    return new Promise((resolve, reject) => {
        const { instance } = createInstance()
        Object.assign(instance, Modal.defaultOptions, typeof options === 'string' ? { message: options } : options, {
            resolve,
            reject
        })
        instance.show = true
    })
}

Modal.confirm = (options: ModalOptions) => {
    Modal({
        ...options,
        showConfirmBtn: true
    })
}

export default Modal

使用

使用也非常简单:
在这里插入图片描述
在这里插入图片描述
原理这些下次再解释。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue小技巧-公共组件开发 的相关文章

  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • Eslint errorring 导入没有扩展名的 jsx

    我正在尝试在 es6 中导入 jsx 文件而不需要 jsx 扩展名 import LoginErrorDialog from LoginErrorDialogView Not import LoginErrorDialog from Log
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 在重复内容区域添加

    我有一个菜单组件 简单地说 它接受一个带有一系列选项的道具 并为每个选项在菜单中呈现一个项目 我希望能够根据用例自定义每个菜单项内的标记 因此我在菜单项元素内使用了占位符 你可以在这个中看到一个例子fiddle https jsfiddle
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • 检查 jQuery 1.7 中是否存在基于文本的选择选项

    所以我有以下 HTML 片段
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • Jquery - 选择选项后如何获取选项的特定数据类型?

    我将直接跳到标记 然后解释我想要做什么 HTML 选择选项
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev

随机推荐

  • RuntimeError:shape ‘[4, 3, 85, 80, 80]‘ is invalid for input of size 537600

    在对yolov5进行剪枝训练时出现以下类型的错误 错误原因 1 使用自己 的数据集时 数据集与源代码的数据集的类别数不同 没有修改成对应的类别数 解决办法 修改cfg文件 把classes和filters进行修改 filters class
  • 启用电脑对远程服务器的访问,未启用对服务器的远程访问 win10家庭版

    未启用对服务器的远程访问 win10家庭版 卡饭网 本站整理 2019 07 09 这个问题比较常见小编整理的解决方法如下 方法一 用QQ远程协助对方电脑 需要QQ告诉对方右键单击计算机 这台电脑 点管理 打开计算机管理界面 选择本地用户和
  • git 工具使用--分支管理

    git 工具使用 分支管理 文章目录 git 工具使用 分支管理 理解分支 创建分支 切换分支 合并分支 删除分支 合并冲突 分支管理策略 分支策略 bug分支 删除临时分支 总结 理解分支 分支管理是Git的杀手级功能之一 分支 就是科幻
  • Ajax的核心技术XMLHttpRequest方法

    整个Ajax技术紧紧围绕在XMLHttpRequest对象的周围 Ajax整个技术的过程如下 XMLHttpRequest发送请求 在与服务器交互中 其readyState状态可以监听到服务器 的响应状态 当服务器的响应完成的时候 XMLH
  • 【UiBot】RPA流程机器人有几种类型?

    RPA Robotic Process Automation 机器人流程自动化 是指通过软件自动化方式 使各个行业中本来是人工操作计算机完成的业务 实现工作流程的自动化 RPA机器人的交互方式大致可分为两大主要类型 人机交互型和无人值守型
  • JS逆向获取网易云音乐评论并保存到mongodb数据库

    JS逆向获取网易云音乐评论 前言 这段时间 一直在研究JS逆向 今天小试牛刀一下 利用JS逆向技术获取网易云音乐评论 一 分析网页 其实网易云音乐评论的api很好找到的 我们通过F12进入到浏览器 chrome 的开发者模式 因为音乐的评论
  • 递推均值滤波算法---链式队列实现

    目录 为什么要写这篇 为什么要用队列实现 程序是怎么实现的 程序实现结果 程序代码 为什么要写这篇 仍记得当初写了一篇去除极值的均值滤波算法相关的博客 该算法用在了ADC采样上面 当初偶然看见还有一种递推均值滤波算法 用在了实时波形输出上面
  • F2FS – A New Flash File System for Mobile Devices – ELCE 2012

    本文转载至 http www cnx software com 2013 01 15 f2fs a new flash file system for mobile devices elce 2012 Joo Young Hwang pri
  • 计算机视觉方面的代码

    Jia Bin Huang同学收集了很多计算机视觉方面的代码 链接如下 https netfiles uiuc edu jbhuang1 www resources vision index html 这些代码很实用 可以让我们站在巨人的肩
  • 罗马数字转换器

    我的CSDN主页 My Python 学习个人备忘录 我的博文推荐 罗马数字转换器 整数转罗马数字 本转换器 以1 3999的正整数为限 看到CSDN 每日一练 python 题目 罗马数字转整数 的练习题目 就想写个 整数转罗马数字 的练
  • 前缀和以及二分法解题

    1 寻找数组的中心索引 解法1 初始解法 思路 长度为1的数组 中心索引一定是它本身的那个唯一元素 左右两边的和都为0 长度为2的数组 除非两个元素都为0 那么这样才存在中心索引 且选最左边的0 长度大于等于2的数组 我们现在讨论普遍的情况
  • 查找std::vector最大值、最小值及相应的索引位置

    使用STL的vector时 利用函数max element min element distance可以获取vector中最大值 最小值和对应的位置索引 方法如下 include
  • 相似度量

    相似度量 MATLAB实现相似度计算 对数似然相似度 Jaccard相似度 余弦相似度 目录 相似度量 MATLAB实现相似度计算 对数似然相似度 Jaccard相似度 余弦相似度 基本描述 程序设计 学习总结 参考资料 基本描述 在数据分
  • 帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案

    帆软 finereport FCRA 考试 题库 答案 共收录561题 大部分有答案 入门基础 11 多选题 以下方式中属于FineReport中预览模式的有 分页预览 填报预览 新填报预览 数据分析 移动端预览 16 判断题 FineRe
  • 在MINI2440开发板上添加qtopia应用程序

    在MINI2440开发板上添加qtopia应用程序 2012 07 25 16 15 00 转载 标签 it 分类 Linux 一 将生成的 c h cpp这三个 放到一个文件夹里 拷贝其他的 pro 并修改做一个pro 文件 pro 内容
  • python九九乘法表:输入一个整数n,输出九九乘法表前n行的内容

    任务描述 相关知识 Python的格式化输出 使用 符号进行格式化输出 使用 format 进行格式化输出 使用 f string 进行格式化输出 编程要求 测试说明 任务描述 本关任务 编写一个能打印九九乘法表的小程序 相关知识 为了完成
  • 每日一题——螺旋矩阵

    题目描述 对于一个n行m列的表格 我们可以使用螺旋的方式给表格依次填上正整数 我们称填好的表格为一个螺旋矩阵 例如 一个4行5列的螺旋矩阵如下 1 2 3 4 5 14 15 16 17 6 13 20 19 18 7 12 11 10 9
  • 手把手教你如何创建虚拟环境,安装pytorch,文末提供安装包

    1 验证conda是否安装成功 在安装pytorch之前 需要验证coda安装是否成功 WIN R键 打开cmd 输入nvcc V 出现以下界面说明安装成功 并且知道版本为10 2 记住 2 创建虚拟环境 在命令窗口输入命令cona cre
  • 程序员2021最佳工作地,这里平均$280k年薪独领风骚!

    2021年哪个城市最适合STEM就业 近日WalletHub就给出了答案 在调查了包含STEM就业机会 友好度 生活质量 岗位空缺 薪资等各方面指标后 确定了一份2021年STEM最佳求职城市榜单 西雅图成功夺得桂冠 适合STEM最佳 最差
  • Vue小技巧-公共组件开发

    我们会遇到很多类似于这样的场景 公共组件弹窗 点击确定 取消按钮会执行某个函数 一般做法是同props把弹窗一些value function注入进去 然后子组件emit执行一下 但是这样有一个问题 就是太麻烦了 本文通过动态挂载组件的 方式