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 相关文章推荐
文本加密解密
Jun 23 Javascript
javascript中的onkeyup和onkeydown区别介绍
Apr 28 Javascript
MultiSelect左右选择控件的设计与实现介绍
Jun 08 Javascript
js导航栏单击事件背景变换示例代码
Jan 13 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
Sep 09 Javascript
深入浅析JavaScript中的constructor
Apr 19 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
Oct 18 Javascript
基于VUE实现的九宫格抽奖功能
Sep 30 Javascript
JS实现倒计时图文效果
Nov 17 Javascript
JavaScript学习笔记之数组基本操作示例
Jan 09 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
Mar 29 Javascript
Nest.js参数校验和自定义返回数据格式详解
Mar 29 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与ASP
2006/10/09 PHP
PHP explode()函数用法、切分字符串
2012/10/03 PHP
PHP Class&amp;Object -- 解析PHP实现二叉树
2013/06/25 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
JavaScript this调用规则说明
2010/03/08 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
python实现比较两段文本不同之处的方法
2015/05/30 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
python定位xpath 节点位置的方法
2019/08/27 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
五年级数学教学反思
2014/02/11 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
银行员工考核评语
2014/12/31 职场文书
施工员岗位职责范本
2015/04/11 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS