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 相关文章推荐
各种常用浏览器getBoundingClientRect的解析
May 21 Javascript
Jquery简单实现GridView行高亮的方法
Jun 15 Javascript
jQuery检查事件是否触发的方法
Jun 26 Javascript
javascript实现获取浏览器版本、浏览器类型
Dec 02 Javascript
基于jQuery仿淘宝产品图片放大镜特效
Oct 19 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
Jul 11 Javascript
AngularJS教程之简单应用程序示例
Aug 16 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
Jan 21 Javascript
express默认日志组件morgan的方法
Apr 05 Javascript
JS实现区分中英文并统计字符个数的方法示例
Jun 09 Javascript
详解ES6 export default 和 import语句中的解构赋值
May 28 Javascript
vue和小程序项目中使用iconfont的方法
May 19 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
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
PHP制作万年历
2015/01/07 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
详解Vue之事件处理
2020/07/10 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
python多维数组切片方法
2018/04/13 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
厨师长岗位职责
2014/03/02 职场文书
倡议书范文
2014/04/16 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
付款承诺函范文
2015/01/21 职场文书
协议书范文
2015/01/27 职场文书
统计员岗位职责范本
2015/04/14 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电
HDFS免重启挂载新磁盘
2022/04/06 Servers