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 相关文章推荐
javascript dom 操作详解 js加强
Jul 13 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
Oct 03 Javascript
js 巧妙去除数组中的重复项
Jan 25 Javascript
ajax上传时参数提交不更新等相关问题
Dec 11 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
Aug 08 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
Dec 03 Javascript
JavaScript显示当前文档最后修改日期的方法
Mar 19 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
Sep 09 Javascript
jquery背景跟随鼠标滑动导航
Nov 20 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
May 10 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
如何使用vue3打造一个物料库
May 08 Vue.js
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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
php empty函数 使用说明
2009/08/10 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
php表单处理操作
2017/11/16 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
从零开始封装自己的自定义Vue组件
2018/10/09 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
解决Django no such table: django_session的问题
2020/04/07 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
工厂门卫岗位职责
2013/11/25 职场文书
网上卖盒饭创业计划书范文
2014/02/07 职场文书
《乡愁》教学反思
2014/02/18 职场文书
高中同学会活动方案
2014/08/14 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
入门学习Go的基本语法
2021/07/07 Golang