vue 动态创建组件的两种方法

作者:_冰 时间:2024-05-09 10:51:27 

Vue动态创建组件实例并挂载到body

方式一


import Vue from 'vue'

/**
* @param Component 组件实例的选项对象
* @param props 组件实例中的prop
*/
export function create(Component, props) {
const comp = new (Vue.extend(Component))({ propsData: props }).$mount()

document.body.appendChild(comp.$el)

comp.remove = () => {
 document.body.removeChild(comp.$el)

comp.$destroy()
}

return comp
}

方式二


import Vue from 'vue'

export function create(Component, props) {
// 借鸡生蛋new Vue({render() {}}),在render中把Component作为根组件
const vm = new Vue({
 // h是createElement函数,它可以返回虚拟dom
 render(h) {
  console.log(h(Component,{ props }));

// 将Component作为根组件渲染出来
  // h(标签名称或组件配置对象,传递属性、事件等,孩子元素)
  return h(Component, { props })
 }
}).$mount() // 挂载是为了把虚拟dom变成真实dom
// 不挂载就没有真实dom
// 手动追加至body
// 挂载之后$el可以访问到真实dom
document.body.appendChild(vm.$el)

console.log(vm.$children);

// 实例
const comp = vm.$children[0]

// 淘汰机制
comp.remove = () => {
 // 删除dom
 document.body.removeChild(vm.$el)

// 销毁组件
 vm.$destroy()
}

// 返回Component组件实例
return comp
}

使用

A组件(要动态创建的组件)


<template>
<div class="a">
 <h2>{{ title }}</h2>
 <p>{{ data }}</p>
</div>
</template>

<script>
export default {
props: {
 title: {
  type: String,
  default: "hello world!"
 },
 message: {
  type: String,
  default: "o(∩_∩)o 哈哈"
 },
 duration: {
  type: Number,
  default: 1000
 }
},
data() {
 return {
  data: "我是a组件",
 };
},
created() {
 let num = 1

const timer = setInterval(() => {
  this.data = num++
 }, this.duration)

this.$once("hook: beforeDestroy", () => clearInterval(timer))
}
};
</script>

<style>
.a {
position: fixed;
width: 100%;
top: 16px;
left: 0;
text-align: center;
pointer-events: none;
background-color: #fff;
border: grey 3px solid;
box-sizing: border-box;
}
</style>

B组件(操作动态创建组件的地方)


<template>
<div class="b">
 <button @click="createA">创建</button>
</div>
</template>

<script>
import A from "@/components/A.vue"
import { create } from "@/utils/create.js"
export default {

components: {
 A,
},
methods: {
 createA() {
  // 创建A组件,并挂载到body上
  create(A, { title: "vue", message: "么么哒😙" })
 }
},
};
</script>

vue 动态创建组件的两种方法

来源:https://www.cnblogs.com/guojiabing/p/12805735.html

标签:vue,组件
0
投稿

猜你喜欢

  • python去掉字符串中重复字符的方法

    2022-11-23 09:17:35
  • MySQL基于DOS命令行登录操作实例(图文说明) <font color=red>原创</font>

    2024-01-16 13:54:21
  • 用python给csv里的数据排序的具体代码

    2021-02-15 01:12:25
  • Django实现发送邮件功能

    2021-05-13 10:25:44
  • asp如何做一个自己的QQ?

    2010-07-14 19:11:00
  • 使用Pycharm创建一个Django项目的超详细图文教程

    2021-07-13 10:47:17
  • vue中如何引入html静态页面

    2023-07-02 17:03:34
  • SQL Server中通过reverse取某个最后一次出现的符号后面的内容(字符串反转)

    2024-01-23 14:19:39
  • ASP利用TCPIP.DNS组件实现域名IP查询

    2010-02-26 11:25:00
  • SQL SERVER触发器详解

    2024-01-22 01:50:00
  • tensorflow之自定义神经网络层实例

    2022-05-26 07:05:27
  • Python爬虫程序架构和运行流程原理解析

    2023-10-04 16:04:24
  • sql2000如何完美压缩.mdf文件

    2010-03-03 15:47:00
  • 简单聊聊Python中的鸭子类型和猴子补丁

    2022-06-17 00:32:58
  • 快速掌握和使用Flyway的详细教程

    2023-03-05 15:24:24
  • python内置函数:lambda、map、filter简单介绍

    2021-06-06 02:06:01
  • 重置mysql的root密码最简单的方法

    2024-01-18 22:30:02
  • python使用xlsxwriter实现有向无环图到Excel的转换

    2022-01-24 06:42:54
  • 快速解决cv2.imread()读取图像为BGR的问题

    2023-03-11 12:13:16
  • 详解Mysql基础语法的使用

    2024-01-28 07:50:05
  • asp之家 网络编程 m.aspxhome.com