Vue 动态组件与 v-once 指令的实现


Posted in Javascript onFebruary 12, 2019

本文介绍了Vue 动态组件与 v-once 指令的实现,分享给大家,具体如下:

<div id="root">
  <child-one></child-one>
  <child-two></child-two>
  <button>change</button>
</div>
Vue.component('child-one', {
  template: `<div>child-one</div>`,
})
Vue.component('child-two', {
  template: `<div>child-two</div>`,
})
let vm = new Vue({
  el: '#root'
})

上面代码需实现,当点击按钮时,child-one和child-two实现toggle效果,该怎么实现呢?

<div id="root">
  <child-one v-if="type === 'child-one'"></child-one>
  <child-two v-if="type === 'child-two'"></child-two>
  <button @click="handleBtnClick">change</button>
</div>
Vue.component('child-one', {
  template: `<div>child-one</div>`,
})
Vue.component('child-two', {
  template: `<div>child-two</div>`,
})
let vm = new Vue({
  el: '#root',
  data: {
    type:'child-one'
  },
  methods: {
    handleBtnClick(){
      this.type = this.type === 'child-one' ? 'child-two' : 'child-one'
    }
  }
})

通过上面handleBtnClick函数的实现,配合v-if指令就能实现toggle效果

动态组件

下面这段代码实现的效果和上面是一样的。

<div id="root">
  <component :is="type"></component>   //is内容的变化,会自动的加载不同的组件
  <button @click="handleBtnClick">change</button>
</div>
Vue.component('child-one', {
  template: `<div>child-one</div>`,
})
Vue.component('child-two', {
  template: `<div>child-two</div>`,
})
let vm = new Vue({
  el: '#root',
  data: {
    type:'child-one'
  },
  methods: {
    handleBtnClick(){
      this.type = this.type === 'child-one' ? 'child-two' : 'child-one'
    }
  }
})

动态组件的意思是它会根据is里面数据的变化,会自动的加载不同的组件

v-noce指令

每次点击按钮切换的时候,Vue 底层会帮我们干什么呢?Vue 底层会判断这个child-one组件现在不用了,取而代之要用child-two组件,然后它就会把child-one组件销毁掉,在创建一个child-two组件。假设这时child-two组件要隐藏,child-one组件要显示,这个时候要把刚刚创建的child-two销毁掉,在重新创建child-one组件,也就是每一次切换的时候,底层都是要销毁一个组件,在创建一个组件,这种操作会消耗一定的性能。如果我们的组件的内容,每次都是一样的可以在上面加一个v-once,看下面代码。

Vue.component('child-one', {
  template: `<div v-once>child-one</div>`,
})
Vue.component('child-two', {
  template: `<div v-once>child-two</div>`,
})

加上v-once指令之后,有什么好处呢?当chlid-one组件第一次被渲染时,因为组件上面有一个v-once指令,所以它直接就放到内存里了,当切换的时候child-two组件第一次被渲染时,它也会被放到内存里,再次点击切换时,这时并不需要再重新创建一个child-one组件了,而是从内存里直接拿出以前的child-one组件,它的性能会更高一些。

所以在 Vue 当中,通过v-once指令,可以提高一些静态内容的展示效率

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
script的async属性以非阻塞的模式加载脚本
Jan 15 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
JS删除字符串中重复字符方法
Mar 09 Javascript
js中把JSON字符串转换成JSON对象最好的方法
Mar 21 Javascript
jQuery中$.click()无效问题分析
Jan 29 Javascript
JavaScript 中对象的深拷贝
Dec 04 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
从零学习node.js之mysql数据库的操作(五)
Feb 24 Javascript
JS实现汉字与Unicode码相互转换的方法详解
Apr 28 Javascript
Vue 表单控件绑定的实现示例
Aug 11 Javascript
javascript实现移动端红包雨页面
Jun 23 Javascript
微信小程序canvas动态时钟
Oct 22 Javascript
在微信小程序中保存网络图片
Feb 12 #Javascript
VUE中使用MUI方法
Feb 12 #Javascript
如何利用ES6进行Promise封装总结
Feb 11 #Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 #Javascript
Vue表单控件绑定图文详解
Feb 11 #Javascript
图文讲解vue的v-if使用方法
Feb 11 #Javascript
ES6 如何改变JS内置行为的代理与反射
Feb 11 #Javascript
You might like
PHP怎样调用MSSQL的存储过程
2006/10/09 PHP
PHP 类商品秒杀计时实现代码
2010/05/05 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
javascript插入样式实现代码
2012/02/22 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python select.select模块通信全过程解析
2017/09/20 Python
Python闭包思想与用法浅析
2018/12/27 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
python利用线程实现多任务
2020/09/18 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
this关键字的作用
2016/01/30 面试题
建筑工程专业毕业生自荐信
2013/10/19 职场文书
出国留学自荐信
2013/10/25 职场文书
毕业学生推荐信
2013/12/01 职场文书
户外活动策划方案
2014/03/12 职场文书
作文评语集锦大全
2014/04/23 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
高三毕业评语
2014/12/31 职场文书