vue动态子组件的两种实现方式


Posted in Javascript onSeptember 01, 2019

文章目录

  • 方式一:局部注册所需组件
  • 使用缓存
  • 方式二:动态注册组件实现

让多个组件使用同一个挂载点,并动态切换,这就是动态组件。

通过使用保留的 <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>

使用<keep-alive>缓存

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

基本用法:

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

条件判断

如果有多个条件性的子元素,<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

方式二:动态注册组件实现

asyncComponents(templateName){
  this.curNavComponents = require(`./components/${templateName}.vue`).default;
}

总结

以上所述是小编给大家介绍的vue动态子组件的两种实现方式,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
jquery 圆形旋转图片滚动切换效果
Jan 19 Javascript
拉动滚动条加载数据的jquery代码
May 03 Javascript
jquery如何扑捉回车键触发的事件
Apr 24 Javascript
jQuery同步提交示例代码
Dec 12 Javascript
JavaScript的String字符串对象常用操作总结
May 26 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
Oct 25 Javascript
说说如何在Vue.js中实现数字输入组件的方法
Jan 08 Javascript
原生js+css调节音量滑块
Jan 15 Javascript
Webpack中SplitChunksPlugin 配置参数详解
Mar 24 Javascript
微信小程序文章详情功能完整实例
Jun 03 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 Vue.js
vue项目支付功能代码详解
Feb 18 Vue.js
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
Sep 01 #Javascript
简单分析js中的this的原理
Aug 31 #Javascript
微信小程序image图片加载完成监听
Aug 31 #Javascript
JS实现使用POST方式发送请求
Aug 30 #Javascript
node.js处理前端提交的GET请求
Aug 30 #Javascript
Node.js系列之连接DB的方法(3)
Aug 30 #Javascript
Node.js系列之发起get/post请求(2)
Aug 30 #Javascript
You might like
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
PHP分页函数代码(简单实用型)
2010/12/02 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
JS打印组合功能
2016/08/04 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
Linux下Python获取IP地址的代码
2014/11/30 Python
Django中对数据查询结果进行排序的方法
2015/07/17 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
通过python爬虫赚钱的方法
2019/01/29 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
canvas烟花特效锦集
2018/01/17 HTML / CSS
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
一组SQL面试题
2016/02/15 面试题
介绍一下linux文件系统分配策略
2012/11/17 面试题
在校大学生的职业生涯规划书
2014/03/14 职场文书
初中信息技术教学反思
2016/02/16 职场文书