首页 > 其他分享 >关于函数式弹窗组件遇到的问题

关于函数式弹窗组件遇到的问题

时间:2024-07-27 18:20:12浏览次数:15  
标签:openModal const 函数 appContext divDom 组件 弹窗

好久没写博客了。其实也不是没写,只是没发布到的网上。

这回记录一个在开发函数式组件中碰到的问题。

开门还是不要见山

起因是这样的,入职现在这家公司后,发现有些代码习惯挺不适合我的,就是不习惯,没事那就折腾嘛。所以就有了接下来的故事。

废两句话,首先说碰到什么问题呢?

公司组件库二开了elementplus的table组件,但是没有实现行内编辑以及校验的功能,所以我又在这个组件基础上再一次封装实现行内编辑以及校验的功能,叫做KwTable。然后公司的弹窗依然是二开的elementplus的eldialog,从搬砖一坤年以来我一直不喜欢这个dialog,单纯因为丑,而且打开一个弹窗需要用标签去使用,再加一个理由就是难用,所以我又二开eldialog实现函数式弹窗,叫做openModal函数。

好的,这两玩意我用得挺爽得,一直到前天周四的时候我发现一个问题,就是通过openModal函数打开的弹窗,这个弹窗里用到了kwtable就会报错,是表格透传插槽的v-for里报的,说是不能从undefined上读取值。同时还有一个问题就是通过openModal打开的弹窗里面使用的组件统统都要手动引入注册一遍,明明我已经全局注册了。但是为了不影响业务开发和进度,我选择了先回避这个问题,想着之后有时间再解决吧,于是我在弹窗里就没用kwtable了。

到了昨天周五,另一个同事也用了openModal和kwtable,好家伙他发现出错了,直接找到我前端组长和我导师,他两一顿检查一直盯着表格看(因为是表格报错),没发现有什么异常,于是就找我了,因为他们知道kwtable是我封装的,很显然我知道问题在哪里,我没急着解决.....你们就碰到问题了,没事不慌,只能说”没急着解决“变成”现在必须解决“了。

上伪代码

function openModal() {
        const mountDiv = document.createElement('div');
        mountDiv.id = 'dialog';
        const divDom = document.body.appendChild(mountDiv);
        render(
            h(
                ElDialog, 
                {
                    modelValue: true,
                    title: '标题',
                    onClosed: () => {
                        render(null, divDom);
                        divDom.remove();
                    }
                },
                {
                    default: () => h(HelloWorld, null)
                }
            ),
            divDom
        );
    }

这段代码,再简单不过了,先创建一个div作为容器等下把弹窗通过他渲染,给他设置id,再把他添加到文档body下,与vue的#app同级,接着再使用h函数创建一个虚拟dom,再通过render把他渲染出来,ez。

这段代码在我其他的项目中是正常使用的,没发现任何异常,只有在公司的项目中才发现有古怪,所以我感觉可能受前端项目基建配置插件的影响,比如vue自动导入,elementplus自动导入注册等等。

解决过程

首先出问题了肯定是问gpt,他也没答出个所以然出来,可能是我提问的方式有待进步吧。

然后就去看elementplus源码呗,出发点在ElMessageBox,这个组件是基于vue开发的,凭什么在实际使用中渲染这个组件只需要一行js代码,调用ElMessageBox这个函数就可以渲染组件,而我写的组件就需要在template模板中显示的写出来。其实在elementplus文档上也写了一个”继承应用程序上下文“,突破口就在这里,他暗示我已经很明显了:

从文档示例看到:ElMessageBox({}, appContext)。而我只需要关注elementplus拿这个appContext在内部做了什么处理。

所以,源码,启动!

首先找到MessageBox方法,然后就关注appContext被如何处理,看到上面的代码就明白了,其实他的处理就比我的代码多了一行(76行),也就是 vnode.appContext = appContext,没错就是这一行,把他粘贴到我的代码里

<script setup>
// 伪代码
const { appContext } = getCurrentInstance()!
function openModal() {
        const mountDiv = document.createElement('div');
        mountDiv.id = 'dialog';
        const divDom = document.body.appendChild(mountDiv);
        const vnode = h(
                ElDialog, 
                {
                    modelValue: true,
                    title: '标题',
                    onClosed: () => {
                        render(null, divDom);
                        divDom.remove();
                    }
                },
                {
                    default: () => h(HelloWorld, null)
                }
            );
        vnode.appContext = appContext;
        render(
            vnode,
            divDom
        );
    }

</script>

于是昨天周五完美解决!牛马下班!

 

到此,开头说的问题已经发现原因了:

  • 通过openModal函数打开的弹窗,这个弹窗里用到了kwtable就会报错。因为上下文对象丢失。
  • 通过openModal打开的弹窗里面使用的组件统统都要手动引入注册一遍。因为上下文对象丢失。

 

标签:openModal,const,函数,appContext,divDom,组件,弹窗
From: https://www.cnblogs.com/ruyan-lx/p/18327285

相关文章

  • Vue 3 中 13 种不同的组件通信方法
    在Vue3中,组件之间的通信是构建应用程序的关键。本指南将介绍13种不同的组件通信方法,从最简单到最复杂,帮助你选择最适合你需求的方式。h21.父组件向子组件传递数据(Props)这是最基本也是最常用的通信方式。父组件通过属性向子组件传递数据。「父组件:」<template>......
  • 六、函数
    6.1定义函数defgreet_user():"""显示简单的问候语"""print('Hello!')greet_user()#调用函数 6.1.1向函数传递信息defgreet_user(username):"“显示简单的问候语"” print(f"Hello,{username.title()}!")greet_user('j......
  • ast获取指定python文件中携带指定装饰器函数的实现
    在实现自动化测试过程中,需要根据指定的装饰器来标记需要执行的用例或函数,下面根据使用ast库来实现读取指定文件中的数据结构后对其内容进行解析并拿到携带对应装饰器的函数。根据以下方法仅能解析func、class-func的数据结构,其余数据结构可能不兼容,需要根据实际情况进行完善调整......
  • 有参构造函数注入底层源码深入剖析**前戏
    有参构造函数注入底层源码深入剖析前戏方式一:创建两个类:publicclassTestDIBean{ publicStringsay(){ return"IamTestDIBean.say()"; }}packagecom.coding.spring.practies;publicclassTestDIBean1{ privateTestDIBeantestDIBean; publicTestDIBean......
  • useRoute 函数的详细介绍与使用示例
    title:useRoute函数的详细介绍与使用示例date:2024/7/27updated:2024/7/27author:cmdragonexcerpt:摘要:本文介绍了Nuxt.js中useRoute函数的详细用途与示例,展示了如何在组合式API中使用useRoute获取当前路由信息,包括动态参数、查询参数等,并提供了丰富的计算引用说明,如......
  • NIO三大组件关系
    JavaNIO同步非阻塞模式,通过Selector选择器使一个线程从某通道(Channel已就绪准备好数据载体),让线程不会因为阻塞没事可做通俗理解:NIO是可以做到用一个线程来处理多个操作的.假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理.不像之前的阻塞IO那样,非......
  • 《梦醒蝶飞:释放Excel函数与公式的力量》23.1 学生主导的项目案例
     第23章:学生项目展示 23.1学生主导的项目案例在《梦醒蝶飞:释放Excel函数与公式的力量》中,第23章将展示学生主导的项目案例。这些案例展示了学生如何运用所学的Excel函数与公式,解决实际问题,展示他们的创造力和分析能力。案例1:学校活动管理系统背景:某学校希望建立一个活动......
  • 《梦醒蝶飞:释放Excel函数与公式的力量》23.2 项目评估与反馈
     第23章:学生项目展示 23.2项目评估与反馈在学生项目展示中,项目评估与反馈是至关重要的一环。通过评估和反馈,可以识别项目中的优点和不足,帮助学生不断改进和提升。以下是项目评估与反馈的详细步骤和示例。项目评估的关键要素1.目标达成情况2.项目计划与执行3.数据准......
  • 《梦醒蝶飞:释放Excel函数与公式的力量》21.2 问题解决策略
     第21章:综合案例分析 21.2问题解决策略在综合案例分析中,解决问题的策略涉及多个步骤,从问题的识别、分析到实施解决方案和评估效果。通过系统的方法和多学科的知识,可以高效地解决复杂的问题。以下将介绍一个具体案例,并通过详细的步骤展示如何制定和实施问题解决策略。案例......
  • 【微信小程序开发】API使用、自定义组件、页面实现图解超详细
    文章目录常用API消息交互消息加载转发给朋友模态对话框获取用户信息调起客户端扫码界面发起支付获取位置自定义组件创建自定义组件使用自定义组件组件生命周期组件所在页面的生命周期页面实现淘宝订单简化页面饮品订单简化页面本篇总结更多相关内容可查看常用......