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 相关文章推荐
Javascript计算时间差的函数分享
Jul 04 Javascript
JavaScript中__proto__与prototype的关系深入理解
Dec 04 Javascript
JS中eval函数的使用示例
Jul 21 Javascript
悬浮广告方法日常收集整理
Mar 18 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
Jul 11 Javascript
Angular2从搭建环境到开发步骤详解
Oct 17 Javascript
JS实现搜索框文字可删除功能
Dec 28 Javascript
vue中如何实现变量和字符串拼接
Jun 19 Javascript
Node.js自定义实现文件路由功能
Sep 22 Javascript
AngularJS实现controller控制器间共享数据的方法示例
Oct 30 Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 Javascript
Javascript ParentNode和ChildNode接口原理解析
Mar 16 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 gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
基于node实现websocket协议
2016/04/25 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
python实现给字典添加条目的方法
2014/09/25 Python
python对json的相关操作实例详解
2017/01/04 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
Scrapy框架使用的基本知识
2018/10/21 Python
python实现快递价格查询系统
2020/03/03 Python
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
办公自动化专业大学生职业规划书
2014/03/06 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
python实现学生信息管理系统(面向对象)
2022/06/05 Python