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防抖与节流
Nov 24 Vue.js
vue+openlayers绘制省市边界线
Dec 24 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
Vue 3自定义指令开发的相关总结
Jan 29 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
如何在 Vue 中使用 JSX
Feb 14 Vue.js
vue引入Excel表格插件的方法
Apr 28 Vue.js
Vue监视数据的原理详解
Feb 24 Vue.js
vue实现滑动解锁功能
Mar 03 Vue.js
vue ref如何获取子组件属性值
Mar 31 Vue.js
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
WIN98下Apache1.3.14+PHP4.0.4的安装
2006/10/09 PHP
SSI指令
2006/11/25 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
世界第一冲浪品牌:O’Neill
2016/08/30 全球购物
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
英语感恩演讲稿
2014/01/14 职场文书
产品售后服务承诺书
2014/05/21 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
社会实践活动总结
2015/02/05 职场文书