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 相关文章推荐
Prototype Array对象 学习
Jul 19 Javascript
深入领悟JavaScript中的面向对象
Nov 18 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
May 23 Javascript
使用纯javascript实现放大镜效果
Mar 18 Javascript
简单实现异步编程promise模式
Jul 31 Javascript
JavaScript的React框架中的JSX语法学习入门教程
Mar 05 Javascript
浅谈javascript中的constructor
Jun 08 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
基于canvas的二维码邀请函生成插件
Feb 14 Javascript
JavaScript this绑定过程深入详解
Dec 07 Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
Apr 27 Javascript
WebPack工具运行原理及入门教程
Dec 02 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
PHP5 面向对象(学习记录)
2009/12/02 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
js日期时间补零的小例子
2013/03/05 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
2017/05/21 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
javascript实现评分功能
2020/06/24 Javascript
python控制台中实现进度条功能
2015/11/10 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
python实现动态创建类的方法分析
2019/06/25 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
保护动物倡议书
2014/04/15 职场文书
我的画教学反思
2014/04/28 职场文书
环保建议书200字
2014/05/14 职场文书
单位未婚证明范本
2014/11/25 职场文书
2014年生产部工作总结
2014/12/17 职场文书
世界环境日活动总结
2015/02/11 职场文书
教师外出学习心得体会
2016/01/18 职场文书
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电