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 相关文章推荐
javascript parseInt 函数分析(转)
Mar 21 Javascript
精通JavaScript 纠正 cleanWhitespace函数
Mar 11 Javascript
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
js用拖动滑块来控制图片大小的方法
Feb 27 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
May 05 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
May 18 Javascript
JS控制TreeView的结点选择
Nov 11 Javascript
Web前端框架Angular4.0.0 正式版发布
Mar 28 Javascript
vue多种弹框的弹出形式的示例代码
Sep 18 Javascript
微信小程序中post方法与get方法的封装
Sep 26 Javascript
JS数组实现分类统计实例代码
Sep 30 Javascript
Element-ui DatePicker显示周数的方法示例
Jul 19 Javascript
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+swoole对client数据实时更新(一)
2016/01/07 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
PHP时间类完整代码实例
2021/02/26 PHP
javascript import css实例代码
2008/07/18 Javascript
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
javascript 高级语法之继承的基本使用方法示例
2019/11/11 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
2020/04/16 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
python解析xml模块封装代码
2014/02/07 Python
python基础教程之元组操作使用详解
2014/03/25 Python
实例解析Python中的__new__特殊方法
2016/06/02 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
django rest framework使用django-filter用法
2020/07/15 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
Linux的文件类型
2016/07/05 面试题
销售心得体会
2014/01/02 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
2015年销售部工作总结范文
2015/04/27 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
导游带团欢迎词
2015/09/30 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python