vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作


Posted in Javascript onOctober 30, 2020

前言

最近在做一个精品课程后台管理系统,其中涉及文件上传和文件列表展示,我不想将他们写入一个组件,故分开两个组件实现,但由于上传文件需要时间,这时要是用户切换别的组件查看时,上传文件组件就销毁了,导致文件上传失败,所以需要采取keep-alive技术实现不销毁上传文件组件,同时也由于系统模块较多,所以需要多组件进行嵌套。

问题:多组件嵌套下如何指定对应的一个或多个组件存活呢?

*tips:要是对于Vue使用keep-alive的基本用法不熟悉的也可以点击查看vue使用keep-alive的基本用法

配置路由加以判断是否使用keep-alive

MVideoUpload,MFileUpload为上传文件组件,故想之存活,而其他组件则需要挂起刷新数据,但由于MVideoUpload,MFileUpload分别嵌套在MVideos,MFiles组件中,为了保证跳转其他模块组件的时候,上传视频和上传文件的模块不销毁(因为一旦父组件销毁,子组件自然也销毁了),所以两个父组件也需要存活,只是之后需要再加以判断存活那几个子组件。

路由js:

{
 path:'resource',
 name:'MResource',
 meta:{
 auth:true  //是否需要登录
 },
 component: () => import('../pages/manage/resource/Resource'),
 children:[
 {
  path: 'videos',
  name: 'MVideos',
  meta:{
  keepAlive:true, //包含存活组件
  auth:true  //是否需要登录
  },
  component: () => import('../pages/manage/resource/videos/Videos'),
  children:[
  {
   path:'list',
   name:'MVideoList',
   meta:{
   auth:true  //是否需要登录
   },
   component: () => import('../pages/manage/resource/videos/VideosList'),
  },
  {
   path:'upload',
   name:'MVideoUpload',
   meta:{
   keepAlive:true, //需要存活
   auth:true  //是否需要登录
   },
   component: () => import('../pages/manage/resource/videos/UploadVideo'),
  },
  {
   path:'update',
   name:'MVideoUpdate',
   meta:{
   auth:true  //是否需要登录
   },
   component: () => import('../pages/manage/resource/videos/UpdateVideo'),
  },
  {
   path:'detail',
   name:'MVideoDetail',
   meta:{
   auth:true  //是否需要登录
   },
   component: () => import('../pages/manage/resource/videos/VideoDetail'),
  },
  ],
  redirect:{name: 'MVideoList'}
 },
 {
  path:'files',
  name:'MFiles',
  meta:{
  keepAlive:true, //包含存活组件
  auth:true  //是否需要登录
  },
  component: () => import('../pages/manage/resource/files/Files'),
  children:[
  {
   path: 'list',
   name: 'MFileList',
   meta:{
   auth:true  //是否需要登录
   },
   component: () => import('../pages/manage/resource/files/FilesList'),
  },
  {
   path:'upload',
   name:'MFileUpload',
   meta:{
   keepAlive:true, //需要存活
   auth:true  //是否需要登录
   },
   component: () => import('../pages/manage/resource/files/UploadFile'),
  },
  {
   path:'update',
   name:'MFileUpdate',
   meta:{
   auth:true  //是否需要登录
   },
   component: () => import('../pages/manage/resource/files/UpdateFile'),
  },
  {
   path:'detail',
   name:'MFileDetail',
   meta:{
   auth:true  //是否需要登录
   },
   component: () => import('../pages/manage/resource/files/FileDetail'),
  },
  ],
  redirect:{name: 'MFileList'}
 },
 ],
 redirect:{name: 'MFiles'}
},

各父组件都是如此:

一层层判断哪些组件需要存活不销毁,从而实现对任意一个组件切换组件时使其存活不销毁。

<transition name="component-fade" mode="out-in">
 <keep-alive>
 <router-view v-if="$route.meta.keepAlive" />
 </keep-alive>
</transition>
<transition name="component-fade" mode="out-in">
 <router-view v-if="!$route.meta.keepAlive" />
</transition>

补充知识:vue页签模式+keep-alive解决关闭页签后缓存组件未销毁问题

1.简介

vue使用页签模式,组件使用keep-alive缓存,发现页签关闭后缓存组件未销毁,只是出于非活动状态

2.解决

使用keep-alive的include属性,这个属性包含了缓存组件的名称,可以将其赋值为动态属性

页签store

export default {
 state: {
  current: layui.data('tag').current || {},//当前页签
  list: layui.data('tag').list || []//页签列表
 },
 getters:{
  /** 标签名称列表 */
  tagNames (state) {
   return state.list.map(function(tag){return tag.name})
  }
 }
}

list是页签对象列表

tagNames为页签名称列表,即要缓存的页签组件名称

<keep-alive v-if="isRouterAlive" :include="tagNames">
   <router-view ></router-view>
</keep-alive>
...mapGetters({
  tagNames:'tagNames'
})

这样就保证了移除tag后,相应的组件名称也不会被缓存

以上这篇vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery的js分页代码
Jun 10 Javascript
js实现快速分享功能(你的文章分享工具)
Jun 25 Javascript
jQuery打印图片pdf、txt示例代码
Jul 22 Javascript
JavaScript原生对象常用方法总结(推荐)
May 13 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
Dec 03 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
javascript实现最长公共子序列实例代码
Feb 05 Javascript
element-ui 中的table的列隐藏问题解决
Aug 24 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
Oct 12 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
Oct 15 Javascript
JavaScript原生数组函数实例汇总
Oct 14 Javascript
vuecli项目构建SSR服务端渲染的实现
Oct 30 #Javascript
Javascript文本框脚本实现方法解析
Oct 30 #Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
Oct 30 #Javascript
vue内置组件keep-alive事件动态缓存实例
Oct 30 #Javascript
Javascript表单序列化原理及实现代码详解
Oct 30 #Javascript
解决Vue-cli无法编译es6的问题
Oct 30 #Javascript
Vue2.0 ES6语法降级ES5的操作
Oct 30 #Javascript
You might like
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
Python中的exec、eval使用实例
2014/09/23 Python
Python用GET方法上传文件
2015/03/10 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
一行python实现树形结构的方法
2019/08/09 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
python字符串下标与切片及使用方法
2020/02/13 Python
python求前n个阶乘的和实例
2020/04/02 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
华为c/c++笔试题
2016/01/25 面试题
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
翻译专业应届生求职信
2013/11/23 职场文书
营销总经理岗位职责
2014/02/02 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
学生安全责任书模板
2014/07/25 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
实习指导教师评语
2014/12/30 职场文书
2015年计算机教师工作总结
2015/07/22 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js