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 相关文章推荐
JScript中的&quot;this&quot;关键字使用方式补充材料
Mar 08 Javascript
javascript判断单选框或复选框是否选中方法集锦
Apr 04 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 03 Javascript
单击按钮显示隐藏子菜单经典案例
Jan 04 Javascript
JavaScript中的数值范围介绍
Dec 29 Javascript
通过伪协议解决父页面与iframe页面通信的问题
Apr 05 Javascript
学习JavaScript设计模式之状态模式
Jan 08 Javascript
Angular.js实现注册系统的实例详解
Dec 18 Javascript
vue项目中应用ueditor自定义上传按钮功能
Apr 27 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
Oct 10 Javascript
jquery实现动态添加附件功能
Oct 23 jQuery
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适配器模式(Adapter)
2014/11/25 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
监控 url fragment变化的js代码
2010/04/19 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
简单介绍Ruby中的CGI编程
2015/04/10 Python
详解Python中where()函数的用法
2018/03/27 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
PyCharm GUI界面开发和exe文件生成的实现
2020/03/04 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
三星印度官网:Samsung印度
2019/08/03 全球购物
优秀求职信范文分享
2014/01/26 职场文书
还款承诺书范文
2014/05/20 职场文书
社会学专业求职信
2014/07/17 职场文书
交通安全横幅标语
2014/10/07 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
800字作文之大雪
2019/12/04 职场文书
SQL Server 数据库实验课第五周——常用查询条件
2021/04/05 SQL Server
python实现的人脸识别打卡系统
2021/05/08 Python
Pygame Time时间控制的具体使用详解
2021/11/17 Python
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android