首页 > 其他分享 >Vue动态创建组件实例并挂载到body

Vue动态创建组件实例并挂载到body

时间:2023-04-11 18:24:56浏览次数:32  
标签:body Vue center default comp 动态创建 props 组件

方式一

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: "么么哒

    标签:body,Vue,center,default,comp,动态创建,props,组件
    From: https://www.cnblogs.com/mmzuo-798/p/17307189.html

相关文章

  • 一个 OpenTiny,Vue2 Vue3 都支持!
    大家好,我是Kagol,OpenTiny 开源社区运营,TinyVue 跨端、跨框架组件库核心贡献者,专注于前端组件库建设和开源社区运营。今天给大家介绍如何同时在Vue2和Vue3项目中使用 TinyVue。TinyVue是一套跨端、跨框架的企业级UI组件库,支持Vue2和Vue3,支持PC端和移动端。......
  • vue3使用elmentui-plus中的图标
    按照官网这样直接引入使用,不知道为啥行不通:import{Document,MenuasIconMenu,Location,Setting,}from'@element-plus/icons-vue'使用时,需要<script>import{UserFilled}from'@element-plus/icons-vue'//使用的时候需要单独引入这个图标从......
  • html概览和head常见标签,body内标签布局
    前端与后端的概念前端 任何与用户直接打交道的操作界面都可以称之为前端>>>:接待员后端 不直接与用户打交道主要负责内部真正的业务逻辑的执行>>>:幕后操作者前端学习之路 专业的前端也需要培训至少六个月而我们作为后端开发工程师前端只学最基本最核心的一块目的不是......
  • ASP.NET Post, FromBody 接参总是null 空值. Web api 前端传递是有值的,怎么回事?
    遇到一个常见错误,前端Post传递data:{array:[1,2,3]},但是API接收的一直是nullAPI方法postApi([FromBody]int[]array,[FromUri]intnum)Debug过程F12检查数据传递结构,没有问题尝试排除法,只保留[FormBody]。postApi([FromBody]int[]array)还是不行。根据网......
  • vue项目中webpack编译glsl文件的配置
    1、 安装webpack-glsl-loader npminstallwebpack-glsl-loader2、修改vue.config.js配置,添加内容如下module.exports=defineConfig({configureWebpack:(config)=>{config.module.rules.push({test:/\.glsl$/,use:[......
  • vue3使用体验--用了之后再也不想用vue2
    0.个人推荐使用setup语法糖,看起来更加简洁。<scriptsetup>import{ref,reactive,onMounted}from'vue';constname=ref('李四');   //定义普通数据类型的响应式,获取/修改数据需要.value,在模板中不需要.value,可以直接使用onMounted(()=>{ //某些业务逻辑。 ......
  • Vue3 setup语法糖添加name属性
    1.安装插件vite-plugin-setup-extendnpmivite-plugin-setup-extend-D2.配置vite.config.tsimportvuefrom'@vitejs/plugin-vue'import{defineConfig}from'vite'//引入插件并使用importvueSetupExtendfrom'vite-plugin-vue-setup-extend�......
  • 【学习笔记】JS+VUE
    JSJS教程HTML定义了网页的内容CSS描述了网页的布局JavaScript控制了网页的行为简介1、什么是JS?JavaScript是一种轻量级的编程语言。JavaScript是可插入HTML页面的编程代码。JavaScript插入HTML页面后,可由所有的现代浏览器执行。2、JS有哪些作用?直接写入H......
  • 用quasar+vue3+组合式api 实现小米商城标题栏动画
    先来看一下小米商城标题栏动画:  小米商城标题栏动画主要特点:移入时二级菜单缓慢出现;移出时二级菜单缓慢消失;在一级菜单之间移动时,二级菜单内容直接切换,没有过渡效果。实现思路一、纯css实现(❌)首先肯定是考虑:hover,但是经过试验发现,:hover可以实现鼠标移入移出时的......
  • vue跳到下一页
    好久没接触vue了,,,写毕设的时候,需要从注册页跳到选择兴趣爱好页, 印象里还记得是使用this.$router.push({path:'/'})来跳到下一页,但是一直跳不进去,why,,,去路由配置中心一看,没毛病啊,配置好兴趣爱好页的路由,然后放到注册页的子页面,,傻了,两个页面同时存在。。。果真,什么路由,什么vue,全......