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 相关文章推荐
JS代码放在head和body中的区别分析
Dec 01 Javascript
标题过长使用javascript按字节截取字符串
Apr 24 Javascript
JavaScript包装对象使用详解
Jul 09 Javascript
自动化测试读写64位操作系统的注册表
Aug 15 Javascript
简单谈谈Vue 模板各类数据绑定
Sep 25 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
JS实现的样式切换功能tableCSS实例
Dec 30 Javascript
移动端基础事件总结与应用
Jan 12 Javascript
JavaScrpt的面向对象全面解析
May 09 Javascript
Vue组件之Tooltip的示例代码
Oct 18 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
Jan 08 Javascript
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 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实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
学习ExtJS form布局
2009/10/08 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
2016/10/21 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
用Python设计一个经典小游戏
2017/05/15 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
详解Python字符串切片
2019/05/20 Python
python实现两个文件夹的同步
2019/08/29 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
python RSA加密的示例
2020/12/09 Python
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
中专自荐信
2013/10/13 职场文书
小学生元旦广播稿
2014/02/21 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
甲午风云观后感
2015/06/02 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers