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 19 Vue.js
vue中父子组件的参数传递和应用示例
Jan 04 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
vue浏览器返回监听的具体步骤
Feb 03 Vue.js
解决vue项目本地启动时无法携带cookie的问题
Feb 06 Vue.js
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
用vite搭建vue3应用的实现方法
Feb 22 Vue.js
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
一篇文章告诉你如何实现Vue前端分页和后端分页
Feb 18 Vue.js
Vue的过滤器你真了解吗
Feb 24 Vue.js
vue实现可以快进后退的跑马灯组件
Apr 08 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
5.PHP的其他功能
2006/10/09 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
smarty获得当前url的方法分享
2014/02/14 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
深入理解JavaScript内置函数
2016/06/03 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
python re正则表达式模块(Regular Expression)
2014/07/16 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
加拿大租车网站:Enterprise Rent-A-Car
2018/07/26 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
市场部规章制度
2014/01/24 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
加入学生会演讲稿
2014/04/24 职场文书
公司担保书范文
2014/05/21 职场文书
三严三实对照检查材料
2014/09/22 职场文书
师德师风培训感言
2015/08/03 职场文书
导游词之无锡梅园
2019/11/28 职场文书
Python可视化神器pyecharts绘制水球图
2022/07/07 Python