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 19 Vue.js
用vue设计一个日历表
Dec 03 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
vite2.0+vue3移动端项目实战详解
Mar 03 Vue.js
vue3.0中使用element的完整步骤
Mar 04 Vue.js
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 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 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
php实现简单爬虫的开发
2016/03/28 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
python基础教程之字典操作详解
2014/03/25 Python
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
python3中zip()函数使用详解
2018/06/29 Python
Flask框架信号用法实例分析
2018/07/24 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
Django实现网页分页功能
2019/10/31 Python
Python遍历字典方式就实例详解
2019/12/28 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
EJB与JAVA BEAN的区别
2016/08/29 面试题
高中生校园生活自我评价
2013/09/19 职场文书
绘画设计学生的个人自我评价
2013/09/20 职场文书
大学生学年个人总结
2015/02/15 职场文书
电影建党伟业观后感
2015/06/01 职场文书
婚庆答谢词大全
2015/09/29 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
分析Netty直接内存原理及应用
2021/06/14 Java/Android
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server