Vue中通过Vue.extend动态创建实例

在Vue中,如果我们想要动态地来控制一个组件的显示和隐藏,比如通过点击按钮显示一个对话框或者弹出一条信息。我们通常会提前写好这个组件,然后通过v-if = “show”来控制它的显示隐藏。如下所示:

    <div>
<button @click = "show = !show">弹出</button>
<span v-if = "show">这是一条通过按钮控制显示隐藏的信息</span>
</div>

另外还有一种实现方法就是通过Vue.extend来动态地创建实例,在想要进行显示的时候创建实例。

在需要隐藏的时候删除这个实例。

  1. 通过Vue.extend创建构造器,这个构造器用于需要显示是创建实例。
const Constructor = Vue.extend({
template:` <span>{{message}}</span> `,
data(){
return {
message:'这是一条通过按钮控制显示隐藏的信息'
}
}
})
  1. 需要显示时创建实例
showHandle(){
const MessageCom = this.MessageCom = new Constructor({
propsData:{
show:true
}
}).$mount(); this.$refs.message.appendChild(MessageCom.$el);
}
  1. 需要隐藏时删除实例
hiddenHandle(){
this.MessageCom.$el.remove()
this.MessageCom.$destroy()
this.MessageCom = null
}

这样的话就同样实现了一个显示,隐藏效果。

使用场景

通过上面的分析,我们发现这种操作完全没有必要,相比于通过属性来控制显示和隐藏;创建实例显得更加麻烦。

但是它同样具有一定的使用场景。比如:单元测试时:

单元测试

在进行单元测试时,为了实现在Vue中的测试,我们必须创建一个基于某个组件的实例,然后才能进行测试。

如下所示:

    it('可以设置icon.', () => {
const Constructor = Vue.extend(Button)
const vm = new Constructor({
propsData: {
icon: 'settings'
}
}).$mount()
const useElement = vm.$el.querySelector('use')
expect(useElement.getAttribute('xlink:href')).to.equal('#i-settings')
vm.$destroy()
})

替代DOM操作

在一些场合下,我们可能需要创建一个div这种,通常的实现方式如下:

let oDiv = document.createElement();
oDiv.innerHTML = 'hello,world';
document.body.appendChild(oDiv);

但是,在Vue中操作DOM是非常不推荐的写法,这时候我们建议使用Vue.extend来实现DOM的操作。

      const Constructor = Vue.extend(Toast);
let oDiv = new Constructor();
oDiv.$slots.default = [message];
oDiv.$mount(); //必须使用$mount()进行挂载,否则所有的生命周期的函数都不会执行
document.body.appendChild(oDiv.$el)

总结:

Vue.extend可以用于动态地创建实例,在一些场景下可以使用。

Vue中通过Vue.extend动态创建实例的更多相关文章

  1. C#反射动态创建实例并调用方法

    在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...

  2. vue通过extend动态创建全局组件(插件)学习小记

    测试环境:nodejs+webpack,例子是看文章的,注释为自己的理解 创建一个toast.vue文件: <template> <div class="wrap" ...

  3. vue 中的translation操作----动态值

    在vue中,也会遇见translate的情况,这里顺带也可以带上如何查找页面中的元素的案例. 1.在加载过程中,有会遇见加载顺序先后的问题,然后查找页面元素null的情况,所以在mounted的钩子函 ...

  4. JavaScript DOM编程基础精华02(window对象的属性,事件中的this,动态创建DOM,innerText和innerHTML)

    window对象的属性1 window.location对象: window.location.href=‘’;//重新导航到新页面,可以取值,也可以赋值. window.location.reloa ...

  5. JS中new的自定义实现创建实例对象

    我们都知道在JS中通常通过对象字面量和new关键字来创建对象,那么今天我就来给大家讲讲new是怎么创建实例对象的:首先创建一个构造函数: function Person(name,age){ this ...

  6. Vue 中的Vue Router一级路由,二级路由,三级路由以及跳转

    今天编写了一下Vue中的路由 先用命令行新建一个空的项目,并且我知道要用路由,就下载了路由的相关依赖 vue init webpack demo5 完毕之后进入所在的项目 cd demo5 之后用vs ...

  7. WCF 动态调用(动态创建实例接口)

    很多时候,服务地址都不止一个的,这个时候就要动态去配置地址.配置Web.config,很麻烦 下面就看看怎样实现动态调用WCF. 首先看看动态创建服务对象的代码: using System; usin ...

  8. 074——VUE中vuex之模块化modules开发实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 062——VUE中vue-router之命名视图的实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载)

    场景 SpringCloud学习之运行第一个Eureka程序: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/90611451 S ...

  2. JS---案例:图标跟着鼠标飞(有bug)

    案例:图标跟着鼠标飞(有bug) <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  3. Python活力练习Day1

    Day1:输入年月日,判断这一天是这一年的第几天   eg:    input : 2019-02-01     output : 32 data = list(input('please input ...

  4. 因为new Date(),我给IE跪了

    处理日期格式是日常工作中的常事,我们经常会对日期字符串和日期对象之间进行转换.今天在IE浏览器就踩了这么一个日期转换的坑. new Date()的坑 后端返回的日期字符串格式为:yyyy-MM-dd ...

  5. ASP.NET Core 2.x 到 3.1 迁移指南

    一.前言 今日(2019/12/4).NET Core 3.1 正式发布了,ASP.NET Core 3.1 随之发布,这次 3.0 到 3.1经过了两个月的短周期,并没有增加重大的功能,主要是对 3 ...

  6. git常用情景和基础命令

    git常用情景和基础命令 将项目克隆到本地 --xxx是git的地址 git clone xxxx 或者初始化git(github提供滴) --新建一个readme.md文件 echo "# ...

  7. 对Python中一些“坑”的总结及技巧

    一.赋值即定义 1.运行以下代码会出现报错 #!/usr/bin/env python #_*_conding:utf-8_*_ x = 100 def outer(): def inner(): x ...

  8. oracle 查询两个字段值相同的记录

    select A.* from tb_mend_enrol A, (select A.Typeid, A.address from tb_mend_enrol A group by A.Typeid, ...

  9. oracle数据库system表空间增长过大的问题

    网上些解决方法,就是关闭审计,之前也有同事推荐这样,下面就是关闭审计的步骤. VALUE=DB即审计开启,改成FALSE即可. SQL> show parameter audit_trail; ...

  10. bayaim_Centos7.6_mysql源码5.7-multi_20190424.txt

    用户名/密码mysql/mysql 一.安装mysql: 位置位于 /data/mysql 如果遇到依赖,无法删除,使用 rpm -e --nodeps <包的名字> 不检查依赖,直接删除 ...