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 相关文章推荐
W3C Group的JavaScript1.8 新特性介绍
May 19 Javascript
js 获取(接收)地址栏参数值的方法
Apr 01 Javascript
javascript数组去重的方法汇总
Apr 14 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
Aug 28 Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 Javascript
整理关于Bootstrap导航的慕课笔记
Mar 29 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
Sep 04 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
Aug 12 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
Sep 25 Javascript
Vue程序化的事件监听器(实例方案详解)
Jan 07 Javascript
js实现弹幕飞机效果
Aug 27 Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 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
一个比较不错的PHP日历类分享
2014/11/18 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
让table变成exls的示例代码
2014/03/24 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
javascript制作2048游戏
2015/03/30 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
2018/05/03 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
使用python实现省市三级菜单效果
2016/01/20 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
学校后勤人员职责
2013/12/27 职场文书
写求职信有什么意义
2014/02/17 职场文书
演讲稿格式范文
2014/05/19 职场文书
临时租车协议范本
2014/09/23 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书