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-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
vue使用require.context实现动态注册路由
Dec 25 Vue.js
vue 动态创建组件的两种方法
Dec 31 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
Vue看了就会的8个小技巧
Jan 21 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
Vue全家桶入门基础教程
May 14 Vue.js
Element-ui Layout布局(Row和Col组件)的实现
Dec 06 Vue.js
Vue Element plus使用方法梳理
Dec 24 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生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
php下获取http状态的实现代码
2014/05/09 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
wxpython学习笔记(推荐查看)
2014/06/09 Python
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
python构建深度神经网络(DNN)
2018/03/10 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
python 循环数据赋值实例
2019/12/02 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
python实现拼接图片
2020/03/23 Python
python实现图片转字符画的完整代码
2021/02/21 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
校园餐饮创业计划书
2014/01/10 职场文书
毕业证丢失证明
2014/01/15 职场文书
学习决心书
2014/03/11 职场文书
文明城市标语
2014/06/16 职场文书
社会学专业求职信
2014/07/17 职场文书
物业消防安全责任书
2014/07/23 职场文书
作风转变心得体会
2014/09/02 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书