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代码编写需要注意的7个小细节小结
Sep 21 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
Jul 12 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
Jun 08 Javascript
AngularJS 整理一些优化的小技巧
Aug 18 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
Jan 09 Javascript
jQuery实现动态控制页面元素的方法分析
Dec 20 jQuery
浅析Vue 生命周期
Jun 21 Javascript
vue.js轮播图组件使用方法详解
Jul 03 Javascript
深入了解JavaScript词法作用域
Jul 29 Javascript
全面解析js中的原型,原型对象,原型链
Jan 25 Javascript
详解js创建对象的几种方式和对象方法
Mar 01 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语法(3)
2006/10/09 PHP
javascript 小型动画组件与实现代码
2010/06/02 PHP
php Session存储到Redis的方法
2013/11/04 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
php实现数组重复数字统计实例
2018/09/30 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python学习笔记:字典的使用示例详解
2014/06/13 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
python select.select模块通信全过程解析
2017/09/20 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
QA工程师岗位职责
2013/11/20 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
行政上诉状范文
2015/05/23 职场文书
javaScript Array api梳理
2021/03/31 Javascript
Python中三种花式打印的示例详解
2022/03/19 Python