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 17 Vue.js
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
vue实现滚动鼠标滚轮切换页面
Dec 13 Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
如何在vue 中使用柱状图 并自修改配置
Jan 21 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
vue3中provide && inject的使用
Jul 01 Vue.js
vue整合百度地图显示指定地点信息
Apr 06 Vue.js
vue使用watch监听属性变化
Apr 30 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中chdir()函数用法实例
2014/11/13 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
移动端日期插件Mobiscroll.js使用详解
2016/12/19 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
vue-cli配置文件——config篇
2018/01/04 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
python实现图片批量压缩程序
2018/07/23 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
python regex库实例用法总结
2021/01/03 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
类的返射机制中的包及核心类
2016/09/12 面试题
灵泰克Java笔试题
2016/01/09 面试题
党员实事承诺书
2014/03/26 职场文书
建国大业电影观后感
2015/06/01 职场文书