Vue动态组件实例解析


Posted in Javascript onAugust 20, 2017

前面的话

让多个组件使用同一个挂载点,并动态切换,这就是动态组件。本文将详细介绍Vue动态组件

概述

通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,可以实现动态组件

<div id="example">
 <button @click="change">切换页面</button>
 <component :is="currentView"></component>
</div>
<script>
var home = {template:'<div>我是主页</div>'};
var post = {template:'<div>我是提交页</div>'};
var archive = {template:'<div>我是存档页</div>'};
new Vue({
 el: '#example',
 components: {
  home,
  post,
  archive,
 },
 data:{
  index:0,
  arr:['home','post','archive'],
 },
 computed:{
  currentView(){
    return this.arr[this.index];
  }
 },
 methods:{
  change(){
   this.index = (++this.index)%3;
  }
 }
})
</script>

也可以直接绑定到组件对象上

<div id="example">
 <button @click="change">切换页面</button>
 <component :is="currentView"></component>
</div>
<script>
new Vue({
 el: '#example',
 data:{
  index:0,
  arr:[
   {template:`<div>我是主页</div>`},
   {template:`<div>我是提交页</div>`},
   {template:`<div>我是存档页</div>`}
  ],
 },
 computed:{
  currentView(){
    return this.arr[this.index];
  }
 },
 methods:{
  change(){
   this.index = (++this.index)%3;
  }
 }
})
</script>

缓存 

<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中

【基础用法】

<div id="example">
 <button @click="change">切换页面</button>
 <keep-alive>
  <component :is="currentView"></component> 
 </keep-alive>
</div>

<script>
new Vue({
 el: '#example',
 data:{
  index:0,
  arr:[
   {template:`<div>我是主页</div>`},
   {template:`<div>我是提交页</div>`},
   {template:`<div>我是存档页</div>`}
  ],
 },
 computed:{
  currentView(){
    return this.arr[this.index];
  }
 },
 methods:{
  change(){
   let len = this.arr.length;
   this.index = (++this.index)% len;
  }
 }
})
</script>

【条件判断】

如果有多个条件性的子元素,<keep-alive> 要求同时只有一个子元素被渲染

<div id="example">
 <button @click="change">切换页面</button>
 <keep-alive>
  <home v-if="index===0"></home>
  <posts v-else-if="index===1"></posts>
  <archive v-else></archive> 
 </keep-alive>
</div>

<script>
new Vue({
 el: '#example',
 components:{
  home:{template:`<div>我是主页</div>`},
  posts:{template:`<div>我是提交页</div>`},
  archive:{template:`<div>我是存档页</div>`},
 },
 data:{
  index:0,
 },
 methods:{
  change(){
   let len = Object.keys(this.$options.components).length;
   this.index = (++this.index)%len;
  }
 }
})
</script>

【activated 和 deactivated】

activated 和 deactivated 在 <keep-alive> 树内的所有嵌套组件中触发

<div id="example">
 <button @click="change">切换页面</button>
 <keep-alive>
  <component :is="currentView" @pass-data="getData"></component> 
 </keep-alive>
 <p>{{msg}}</p>
</div>

<script>
new Vue({
 el: '#example',
 data:{
  index:0,
  msg:'',  
  arr:[
   { 
    template:`<div>我是主页</div>`,
    activated(){
     this.$emit('pass-data','主页被添加');
    },
    deactivated(){
     this.$emit('pass-data','主页被移除');
    },    
   },
   {template:`<div>我是提交页</div>`},
   {template:`<div>我是存档页</div>`}
  ],
 },
 computed:{
  currentView(){
    return this.arr[this.index];
  }
 },
 methods:{
  change(){
   var len = this.arr.length;
   this.index = (++this.index)% len;
  },
  getData(value){
   this.msg = value;
   setTimeout(()=>{
    this.msg = '';
   },500)
  }
 }
})
</script>

【include和exclude】

include 和 exclude 属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示

<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
 <component :is="view"></component>
</keep-alive>
<!-- 正则表达式 (使用 v-bind) -->
<keep-alive :include="/a|b/">
 <component :is="view"></component>
</keep-alive>
<!-- Array (use v-bind) -->
<keep-alive :include="['a', 'b']">
 <component :is="view"></component>
</keep-alive>

匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称(父组件 components 选项的键值)。匿名组件不能被匹配

<keep-alive include="home,archive">
  <component :is="currentView"></component> 
 </keep-alive>

上面的代码,表示只缓存home和archive,不缓存posts

<div id="example">
 <button @click="change">切换页面</button>
 <keep-alive include="home,archive">
  <component :is="currentView"></component> 
 </keep-alive>
</div>
<script src="https://unpkg.com/vue"></script>
<script>
new Vue({
 el: '#example',
 data:{
  index:0,  
  arr:[
   {name:'home',template:`<div>我是主页</div>`},
   {name:'posts',template:`<div>我是提交页</div>`},
   {name:'archive',template:`<div>我是存档页</div>`}
  ],
 },
 computed:{
  currentView(){
    return this.arr[this.index];
  }
 },
 methods:{
  change(){
   var len = this.arr.length;
   this.index = (++this.index)% len;
  },
 }
})
</script>

总结

以上所述是小编给大家介绍的Vue动态组件实例解析,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
自己动手实现jQuery Callbacks完整功能代码详解
Nov 25 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
Mar 03 Javascript
创建js对象和js类的方法汇总
Dec 24 Javascript
js实现新年倒计时效果
Dec 10 Javascript
在AngularJS中使用jQuery的zTree插件的方法
Apr 21 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
Apr 29 Javascript
js 定位到某个锚点的方法
Nov 19 Javascript
JS闭包用法实例分析
Mar 27 Javascript
利用Javascript获取选择文本所在的句子详解
Dec 03 Javascript
vue使用自定义icon图标的方法
May 14 Javascript
详解AngularJS 过滤器的使用
Jun 02 Javascript
vue-router重定向和路由别名的使用讲解
Jan 19 Javascript
jQuery实现表格冻结顶栏效果
Aug 20 #jQuery
Vue组件实例间的直接访问实现代码
Aug 20 #Javascript
JavaScript贪吃蛇小组件实例代码
Aug 20 #Javascript
React Native 环境搭建的教程
Aug 19 #Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
Aug 19 #Javascript
浅谈关于.vue文件中style的scoped属性
Aug 19 #Javascript
如何理解Vue的作用域插槽的实现原理
Aug 19 #Javascript
You might like
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
详解Python中for循环是如何工作的
2017/06/30 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
房地产销售大学生自我评价分享
2013/11/11 职场文书
招商业务员岗位职责
2013/12/16 职场文书
食品安全检查制度
2014/02/03 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
授权委托书范文
2014/07/31 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
四年级小学生评语
2014/12/26 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
安全教育第一课观后感
2015/06/17 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
实习报告范文
2019/07/30 职场文书
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android