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


Posted in Vue.js onDecember 31, 2020

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 动态创建组件的两种方法

以上就是vue 动态创建组件的两种方法的详细内容,更多关于vue 动态创建组件的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue实现购物车的小练习
Dec 21 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
Vue中引入svg图标的两种方式
Jan 14 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
vscode自定义vue模板的实现
Jan 27 Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 Vue.js
详解Vue.js 可拖放文本框组件的使用
Mar 03 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
vue+element ui实现锚点定位
Jun 29 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
Vue 修改网站图标的方法
Dec 31 #Vue.js
Vue中inheritAttrs的使用实例详解
Dec 31 #Vue.js
vue导入.md文件的步骤(markdown转HTML)
Dec 31 #Vue.js
vue-cli4.0多环境配置变量与模式详解
Dec 30 #Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 #Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 #Vue.js
vue中实现点击空白区域关闭弹窗的两种方法
Dec 30 #Vue.js
You might like
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
2018/01/29 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
python实现文件名批量替换和内容替换
2014/03/20 Python
Python中无限元素列表的实现方法
2014/08/18 Python
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
Python模拟用户登录验证
2017/09/11 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
Python中static相关知识小结
2018/01/02 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
python 解决函数返回return的问题
2020/12/05 Python
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
户外婚礼策划方案
2014/02/08 职场文书
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js