vue项目通过appendChild()函数向页面上追加组件

news/2025/2/5 0:57:16/

 前言:

        此篇文章自己结合项目和文档自己理解的,作用于往后遇见此类开发需求时参考。

正文:

1、createApp() 创建一个应用程序实例

function createApp(rootComponent: Component, rootProps?: object): App

        第一个参数是根组件。第二个可选参数是将要传递给根组件的属性。

2、app.mount() 在容器元素中挂载应用程序实例。

interface App {mount(rootContainer: Element | string): ComponentPublicInstance
}

参数可以是实际的DOM元素或CSS选择器(将使用第一个匹配的元素)。返回根组件实例。

如果组件定义了模板或渲染函数,它将替换容器内的任何现有DOM节点。否则,如果运行时编译器可用,容器的innerHTML将被用作模板。

对于每个应用实例,mount()只能被调用一次。

运用:

 App组件:

 页面效果:

在App.vue组件中使用 createApp()函数,通过appendChild 往页面上追加元素

app.vue组件

<template><div id="message"></div>
</template><script setup lang="ts">
import { createApp, onMounted } from "vue";
import Children from "./components/children.vue";
let message: HTMLElement | null;
onMounted(() => {message = document.getElementById("message");createRealDom();
});const createRealDom = () => {const fragment = document.createDocumentFragment() as any;const config = {props: {userName: "Lee_Yu_Fan",address: "北京",},//自定义事件名称前加 ononClickBtn: (value: string) => {console.log("Children组件触发的事件", value);},};const com = createApp(Children, config); //当调用createApp后就会生成一个应用上下文实例,该实例暴露了相关功能APIconst dialog = com.mount(fragment) as any; //其中就包含mount函数,该函数实现组件挂载message?.appendChild(dialog.$el); //dialog.$el
};
</script>
<style scoped>
#message {width: 100%;height: 100%;
}
</style>

children.vue组件

<template><div class="child"><p>我是子组件</p><hr /><p>应用实例传递过来的属性</p><p>{{ props.userName }}</p><p>{{ props.address }}</p><button @click.stop="handlerClick">点击</button></div>
</template>
<script setup lang="ts">
defineProps<{props: {userName: string;address: string;};
}>();
const emits = defineEmits(["ClickBtn"]);
function handlerClick() {// 组件自定义事件emits("ClickBtn", "发送数据到应用实例");
}
</script>
<style>
.child {width: 300px;height: 400px;background-color: pink;
}
</style>

页面效果+点击按钮触发自定义事件后在控制台打印结果:

 

 注意:

       1、 直接在页面上使用组件

在children组件中使用 getCurrentInstance(),打印父组件和根组件

 结果是: (App.vue)

2、 使用 createApp()函数,通过appendChild 往页面上追加元素,在children组件中使用 getCurrentInstance(),打印父组件和根组件,结果是:

 所以,使用 createApp()函数,通过appendChild 往页面上追加的元素,本质上是一个独立的应用程序实例,如果想要使用第三方插件,需要再次通过use()去挂载

 


http://www.ppmy.cn/news/1554977.html

相关文章

Scratch节日作品 | 圣诞节礼物——体验节日的温馨与编程的乐趣! ❄️

今天为大家推荐一款充满节日氛围的Scratch作品——《圣诞礼物》&#xff01;这款程序不仅带来了雪花飘落、圣诞老人和麋鹿的经典场景&#xff0c;还通过编程的形式让小朋友们体验到收到礼物的喜悦。通过这款游戏&#xff0c;小朋友们能学习编程知识、了解圣诞文化&#xff0c;同…

顺序表的使用,对数据的增删改查

主函数&#xff1a; 3.c #include "3.h"//头文件调用 SqlListptr sql_cerate()//创建顺序表函数 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆区申请连续的空间if(NULLptr){printf("创建失败\n");return NULL;//如果没有申请成功&#xff…

VS2022 ASP.NET core Web API 示例代码解释

0. 项目结构 在创建ASP.NET Core Web API项目后&#xff0c;项目的基本结构如下&#xff1a; MyWebApiProject │ Controllers │ └── WeatherForecastController.cs │ Program.cs │ WeatherForecast.cs │ appsettings.json │ ...1. Program.cs 这个文件…

uni-app开发App注意事项

技术选择 分包目前不支持Vue3 个人选择考虑&#xff1a; 1、vue2由于官方不维护了&#xff0c;所以uniapp也不维护了。 2、vue3使用proxy&#xff0c;不支持ios9。 3、目前插件市场中 vue2开发的插件占比更大。 4、如果app页面较多&#xff0c;需要开启分包&#xff0c;但…

Ubuntu中iptables默认是开启的吗

不&#xff0c;Ubuntu 中 iptables 默认不是开启的。 虽然 Ubuntu 系统默认安装了 iptables 软件包&#xff08;你可以通过 dpkg -l iptables 或 which iptables 命令来验证&#xff09;&#xff0c;但这并不意味着 iptables 规则已经生效。实际上&#xff0c;iptables 的规则…

Windows通过指令查看已安装的驱动

Windows通过指令查看已安装的驱动 在 Windows 操作系统中&#xff0c;有几种命令可以用来查看已安装的驱动程序。以下是常见的几种方法&#xff1a; 1. 使用 pnputil 查看已安装驱动程序 pnputil 是一个 Windows 内置工具&#xff0c;可以列出所有已安装的驱动程序包。 命令…

【Linux】Systemtap在CentsOS9上测试成功了

在Ubuntu上测试没有成功&#xff0c;先看看运行成功的效果吧&#xff1a; 看到运行的效果&#xff0c;可以安心些&#xff0c;哈哈 指导操作来源于这里&#xff1a;SystemTap 主要来源于这里&#xff1a; https://sourceware.org/systemtap/SystemTap_Beginners_Guide/using-s…

计算机网络技术基础:1.计算机网络的产生与发展

从1946年世界上第一台计算机ENIAC的诞生&#xff0c;计算机网络的发展大体可分为以下4个阶段。 一、第一代计算机网络——面向终端的计算机网络 第一代计算机网络也称面向终端的计算机网络&#xff0c;它是以主机为中心的通信系统。这样的系统中&#xff0c;除一台中心计算机&…