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的一个OutlookBar类,动态创建导航条
Nov 19 Javascript
js获取指定日期周数以及星期几的小例子
Jun 27 Javascript
多个$(document).ready()的执行顺序实例分析
Jul 26 Javascript
jQuery中的jQuery()方法用法分析
Dec 27 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
JavaScript检查子字符串是否在字符串中的方法
Feb 03 Javascript
js字符串引用的两种方式(必看)
Sep 18 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
Feb 01 Javascript
一步步教会你微信小程序的登录鉴权
Apr 09 Javascript
详解Angular cli配置过程记录
Nov 07 Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 Javascript
JavaScript 实现下雪特效的示例代码
Sep 09 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生成静态页面的简单示例
2014/04/17 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
js实现小星星游戏
2020/03/23 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
快速查询Python文档方法分享
2017/12/27 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
python科学计算之narray对象用法
2019/11/25 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
硕士研究生自我鉴定
2013/11/08 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
应届大学生自荐书
2014/06/17 职场文书
园林系毕业生求职信
2014/06/23 职场文书
党员转正意见怎么写
2015/06/03 职场文书
详解Python中*args和**kwargs的使用
2022/04/07 Python