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 处理表单元素的代码
Feb 15 Javascript
基于jQuery的实现简单的分页控件
Oct 10 Javascript
js中将具有数字属性名的对象转换为数组
Mar 06 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
Nov 07 Javascript
纯css实现窗户玻璃雨滴逼真效果
Aug 23 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
解决Angular.Js与Django标签冲突的方案
Dec 20 Javascript
原生JS实现图片翻书效果
Feb 16 Javascript
JavaScript框架Angular和React深度对比
Nov 20 Javascript
剖析Angular Component的源码示例
Mar 23 Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 Javascript
webpack4 从零学习常用配置(小结)
May 28 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
php实现图片添加水印功能
2014/02/13 PHP
phalcon框架使用指南
2016/02/23 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
Node.js应用设置安全的沙箱环境
2018/04/23 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python简单实现Base64编码和解码的方法
2017/04/29 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
Python实现word2Vec model过程解析
2019/12/16 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
python如何实时获取tcpdump输出
2020/09/16 Python
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
物业管理求职自荐信
2013/09/25 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
关于保护环境的建议书
2014/05/13 职场文书
小学家长通知书评语
2014/12/31 职场文书
关于学习的决心书
2015/02/05 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书