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 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 Vue.js
vue浏览器返回监听的具体步骤
Feb 03 Vue.js
vue中 this.$set的使用详解
Nov 17 Vue.js
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
vue实现可以快进后退的跑马灯组件
Apr 08 Vue.js
vue如何在data中引入图片的正确路径
Jun 05 Vue.js
vue3 自定义图片放大器效果的示例代码
Jul 23 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调用Java对象的方法
2006/10/09 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
document.write的几点使用心得
2014/05/14 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
西部世纪面试题
2014/12/05 面试题
新学期开学寄语
2014/01/18 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
2015中学教学工作总结
2015/07/22 职场文书
退伍军人感言
2015/08/01 职场文书
文明礼貌主题班会
2015/08/14 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
JS实现简单的九宫格抽奖
2022/06/28 Javascript