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


Posted in Javascript onAugust 13, 2019

在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动态创建实例,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Jquery中给animation加更多的运作效果实例
Sep 05 Javascript
鼠标选择动态改变网页背景颜色的JS代码
Dec 10 Javascript
jquery为页面增加快捷键示例
Jan 31 Javascript
JavaScript调用ajax获取文本文件内容实现代码
Mar 28 Javascript
jQuery中hover方法和toggle方法使用指南
Feb 27 Javascript
Angular.js中$apply()和$digest()的深入理解
Oct 13 Javascript
js控制按钮,防止频繁点击响应的实例
Feb 15 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
Nov 08 Javascript
Vue动画事件详解及过渡动画实例
Feb 09 Javascript
vue动态配置模板 'component is'代码
Jul 04 Javascript
javascript绘制简单钟表效果
Apr 07 Javascript
JS实现前端路由功能示例【原生路由】
May 29 Javascript
微信小程序封装分享与分销功能过程解析
Aug 13 #Javascript
node删除、复制文件或文件夹示例代码
Aug 13 #Javascript
vue实现下拉加载其实没那么复杂
Aug 13 #Javascript
vue中created和mounted的区别浅析
Aug 13 #Javascript
微信小程序实现点击空白隐藏的方法示例
Aug 13 #Javascript
微信小程序使用npm包的方法步骤
Aug 13 #Javascript
Vue中的transition封装组件的实现方法
Aug 13 #Javascript
You might like
也谈截取首页新闻 - 范例
2006/10/09 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
python实现对一个完整url进行分割的方法
2015/04/29 Python
Python3处理文件中每个词的方法
2015/05/22 Python
详解python 发送邮件实例代码
2016/12/22 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python高级用法总结
2018/05/26 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
python同时替换多个字符串方法示例
2019/09/17 Python
Footshop法国:购买运动鞋
2020/01/19 全球购物
一套VC试题
2015/01/23 面试题
主持人演讲稿范文
2013/12/28 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
蓝颜请假条
2014/04/11 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书