当前位置: 首页 > article >正文

Vue keep-alive 实战避坑:include/exclude + 路由 meta 标记,中后台路由缓存精准可控|状态管理与路由规范篇

【Vue keep-alive】【中后台路由缓存】从include/exclude控制到路由meta标记彻底搞懂页面缓存可控方案避开组件无name、层级错误等高频坑 文章目录一、先搞清楚为什么要用 keep-alive二、基础用法最简单的 keep-alive2.1 在路由出口处包一层三、include / exclude精确控制「谁缓存、谁不缓存」3.1 参数说明3.2 用 include 做白名单3.3 用 exclude 做黑名单3.4 关键点组件必须有 name3.5 常见坑name 要和 include/exclude 里的完全一致四、路由 meta 标记可维护性更好的方式4.1 路由配置4.2 根据 meta 动态计算 include4.3 Vue 2 中的写法五、更完整的实战结构多级路由 keep-alive5.1 目录结构示例5.2 路由配置5.3 MainLayout.vue 中的 keep-alive5.4 子组件必须定义 name六、生命周期activated 与 deactivated6.1 典型用法刷新列表、恢复滚动七、常见问题与避坑八、推荐规范小结九、小结 系列模块导航同学们好我是 Eugene尤金一名多年中后台前端开发工程师。Eugene 发音 /juːˈdʒiːn/大家怎么顺口怎么叫就好很多前端开发者都会遇到一个瓶颈代码能跑但不够规范功能能实现但维护起来特别痛苦一个人写没问题一到团队协作就各种混乱、踩坑、返工。想写出干净、优雅、可维护的专业代码靠的不是天赋而是体系化的规范 真实实战经验。这一系列《前端规范实战》我会用大白话 真实业务场景不讲玄学、不堆理论只分享能直接落地的规范、标准与避坑指南。帮你从「会写代码」真正升级为「会写优质、可维护、团队级别的代码」。一、先搞清楚为什么要用 keep-alive日常写 Vue 项目时从列表进详情再返回页面会重新渲染数据和滚动位置都会丢失用户体验很差。keep-alive的作用就是把匹配到的组件缓存在内存里切换路由时不会销毁而是保持上一次的状态。再返回时数据、滚动条、表单输入都会保留。适合做缓存的列表页、搜索结果、表单多步骤、数据统计/图表等需要保留状态的页面。不适合缓存的登录页、404、纯静态说明页等。⬆ 返回目录二、基础用法最简单的 keep-alive2.1 在路由出口处包一层!-- App.vue 或根布局组件 --templatedividapprouter-viewv-slot{ Component }keep-alivecomponent:isComponent//keep-alive/router-view/div/template这样写会缓存所有路由组件简单但不可控一般不推荐。⬆ 返回目录三、include / exclude精确控制「谁缓存、谁不缓存」3.1 参数说明参数类型说明includeStringRegExpexcludeStringRegExpmaxNumber最多缓存多少个组件超出按 LRU 策略淘汰这里的「名称」指的是组件的name选项不是路由的path或meta。⬆ 返回目录3.2 用 include 做白名单templaterouter-viewv-slot{ Component }keep-alive:include[ProductList, OrderList, Dashboard]component:isComponent//keep-alive/router-view/template只有name为ProductList、OrderList、Dashboard的组件会被缓存其余不缓存。⬆ 返回目录3.3 用 exclude 做黑名单templaterouter-viewv-slot{ Component }keep-aliveexcludeLoginPage,NotFoundcomponent:isComponent//keep-alive/router-view/templatename为LoginPage、NotFound的组件不会被缓存。⬆ 返回目录3.4 关键点组件必须有 namescriptsetupdefineOptions({name:ProductList// 必须否则 include/exclude 无法匹配})/scripttemplatediv商品列表页/div/template如果组件没有nameinclude/exclude对它是无效的。⬆ 返回目录3.5 常见坑name 要和 include/exclude 里的完全一致// ❌ 错误路由配置里的 component 没有 name{path:/product/list,component:()import(/views/ProductList.vue)}// ProductList.vue 里必须写 defineOptions({ name: ProductList })// ✅ 正确组件 name 和 include 数组里的字符串完全一致// keep-alive :include[ProductList]// ProductList.vue: defineOptions({ name: ProductList })⬆ 返回目录四、路由 meta 标记可维护性更好的方式通过路由的meta标记「是否需要缓存」比在keep-alive里硬编码include数组更清晰也更易维护。4.1 路由配置// router/index.jsconstroutes[{path:/product/list,name:ProductList,component:()import(/views/ProductList.vue),meta:{keepAlive:true}// 标记为需要缓存},{path:/product/detail/:id,name:ProductDetail,component:()import(/views/ProductDetail.vue),meta:{keepAlive:false}// 详情页一般不缓存},{path:/login,name:Login,component:()import(/views/Login.vue),meta:{keepAlive:false}}]⬆ 返回目录4.2 根据 meta 动态计算 include!-- App.vue --templaterouter-viewv-slot{ Component, route }keep-alive:includecachedViewscomponent:isComponent:keyroute.path//keep-alive/router-view/templatescriptsetupimport{computed}fromvueimport{useRouter}fromvue-routerconstrouteruseRouter()// 从路由配置中筛选出 meta.keepAlive true 的组件名constcachedViewscomputed((){returnrouter.getRoutes().filter(routeroute.meta?.keepAliveroute.name).map(routeroute.name)})/script这样只要在路由里改meta.keepAlive就能控制哪些页面被缓存不用再去改keep-alive的配置。⬆ 返回目录4.3 Vue 2 中的写法computed:{cachedViews(){returnthis.$router.options.routes.filter(routeroute.meta?.keepAliveroute.name).map(routeroute.name)}}⬆ 返回目录五、更完整的实战结构多级路由 keep-alive很多项目会区分「有布局的页面」和「无布局的页面」布局里再包一层router-view需要把keep-alive放在正确的层级。5.1 目录结构示例views/ ├── layout/ │ └── MainLayout.vue # 主布局包含侧边栏 内容区 ├── product/ │ ├── ProductList.vue # 商品列表缓存 │ └── ProductDetail.vue # 商品详情不缓存 └── Login.vue # 登录不缓存⬆ 返回目录5.2 路由配置constroutes[{path:/login,component:()import(/views/Login.vue),meta:{keepAlive:false}},{path:/,component:()import(/views/layout/MainLayout.vue),children:[{path:product/list,name:ProductList,component:()import(/views/product/ProductList.vue),meta:{keepAlive:true,title:商品列表}},{path:product/detail/:id,name:ProductDetail,component:()import(/views/product/ProductDetail.vue),meta:{keepAlive:false,title:商品详情}}]}]⬆ 返回目录5.3 MainLayout.vue 中的 keep-alive!-- views/layout/MainLayout.vue --templatedivclassmain-layoutasideclasssidebar.../asidemainclasscontentrouter-viewv-slot{ Component, route }keep-alive:includecachedViewscomponent:isComponent:keyroute.path//keep-alive/router-view/main/div/templatescriptsetupimport{computed}fromvueimport{useRouter}fromvue-routerconstrouteruseRouter()constcachedViewscomputed((){// 只处理当前 layout 下的 children避免把 Login 等算进来constlayoutrouter.getRoutes().find(rr.path/)if(!layout?.children)return[]returnlayout.children.filter(routeroute.meta?.keepAliveroute.name).map(routeroute.name)})/script⬆ 返回目录5.4 子组件必须定义 name!-- ProductList.vue --scriptsetupdefineOptions({name:ProductList})/script⬆ 返回目录六、生命周期activated 与 deactivated被keep-alive缓存的组件不会反复触发mounted/unmounted而是使用activated组件被激活从别的路由切回来时deactivated组件被停用切走时6.1 典型用法刷新列表、恢复滚动scriptsetupimport{ref,onActivated}fromvueimport{useRoute}fromvue-routerconstlistref([])constscrollTopref(0)constrouteuseRoute()// 首次进入或从详情返回都可以在这里刷新onActivated((){loadList()nextTick((){listRef.value?.scrollTo(0,scrollTop.value)})})// 离开时保存滚动位置onDeactivated((){scrollTop.valuelistRef.value?.scrollTop??0})asyncfunctionloadList(){constresawaitfetchList(route.query)list.valueres.data}/script⬆ 返回目录七、常见问题与避坑7.1 缓存了不该缓存的页面现象登录后退出再进登录页还能看到上次的账号。原因登录页被keep-alive缓存了。处理在exclude或meta.keepAlive里排除登录页并确保组件有正确的name。7.2 以为缓存了实际没缓存现象列表页返回后数据丢失。排查组件是否定义了namename是否和include/cachedViews中完全一致keep-alive是否包在了正确的router-view外层多级路由时。7.3 多 Tab 页只缓存一个现象有多个 Tab切换后只保留最后一个的状态。原因多个 Tab 可能共用同一个路由path没有用key区分实例。处理给component加不同的key例如component:isComponent:keyroute.fullPath/这样同一路由的不同参数会当成不同组件实例进行缓存。7.4 缓存的页面需要「按需刷新」可以在meta里加标识或在activated里根据条件决定是否重新请求// 方式1meta 里标记meta:{keepAlive:true,refreshOnActivate:true}// 方式2activated 里判断onActivated((){if(route.query.refresh1){loadList()}})⬆ 返回目录八、推荐规范小结场景建议做法缓存策略用路由meta.keepAlive控制避免在模板里硬编码组件名每个页面组件都定义name且和路由name保持一致keep-alive 位置放在实际渲染页面的router-view外层多级路由时注意层级列表页在activated中按需刷新用deactivated保存滚动位置登录 / 404 等一律meta.keepAlive: false或加入exclude⬆ 返回目录九、小结keep-alive的核心就是三件事include / exclude通过组件name决定缓存范围meta.keepAlive用路由配置统一管理方便维护activated / deactivated在缓存组件里做刷新和状态恢复。记住组件必须写name否则include/exclude不会生效。结合路由meta和生命周期就可以把缓存控制得清晰、可控。⬆ 返回目录 系列模块导航 状态管理与路由规范一、《Vue3 Pinia 状态管理规范状态拆分、Actions 写法、持久化实战避坑状态污染状态管理与路由规范篇》二、《Vue3 Pinia 状态管理规范何时用 Pinia 何时用本地状态状态管理与路由规范篇》三、《Vue Router 实战规范path/name/meta 配置 动态 / 嵌套路由统一团队标准状态管理与路由规范篇》四、《Vue3 Vue Router Pinia 路由守卫规范beforeEach 应做 / 不应做避死循环、防重复请求状态管理与路由规范篇》五、《Vue keep-alive 实战避坑include/exclude 路由 meta 标记中后台路由缓存精准可控状态管理与路由规范篇》 跟着系列慢慢学把技术功底扎扎实实地打牢 系列总览「前端规范实战系列」正在持续更新中后续会整理一篇《前端规范实战系列全系列目录导航》包含每篇文章简介 直达链接方便大家按顺序、体系化学习。更新中敬请期待⬆ 返回目录技术成长从来不是比谁写得快而是比谁写得稳、规范、可维护。哪怕每次只吃透一条规范长期下来差距会非常明显。后续我会持续更新前端规范、工程化、可维护代码相关实战干货帮你告别面条代码、维护噩梦在开发与面试中更有底气。觉得有用欢迎点赞 收藏 关注不错过每一篇实战内容。我是 Eugene与你一起写规范、写优质代码我们下篇干货见

相关文章:

Vue keep-alive 实战避坑:include/exclude + 路由 meta 标记,中后台路由缓存精准可控|状态管理与路由规范篇

【Vue keep-alive】【中后台路由缓存】:从include/exclude控制到路由meta标记,彻底搞懂页面缓存可控方案,避开组件无name、层级错误等高频坑! 📑 文章目录 一、先搞清楚:为什么要用 keep-alive&#xff1f…...

UE5大世界分区系统实战:如何用World Partition优化你的开放世界游戏性能

UE5大世界分区系统深度优化指南:World Partition实战技巧与性能调优 1. 开放世界开发的性能挑战与解决方案 当开发者着手构建下一代开放世界游戏时,传统关卡加载方式在超大规模地图中暴露出的性能瓶颈日益明显。内存占用过高、加载卡顿、场景切换不连贯等…...

开箱即用镜像:LongCat-Image-Editn V2快速部署,免配置直接体验AI改图

开箱即用镜像:LongCat-Image-Editn V2快速部署,免配置直接体验AI改图 1. 镜像介绍:一句话改图的中文神器 LongCat-Image-Editn V2是一款开箱即用的AI图像编辑工具,由美团LongCat团队开源并封装为可直接部署的镜像。这个6B参数的…...

零基础玩转Qwen3-0.6B:手把手教你用LangChain快速搭建智能对话

零基础玩转Qwen3-0.6B:手把手教你用LangChain快速搭建智能对话 1. 从零开始:为什么选择Qwen3-0.6B? 如果你正在寻找一个能快速上手、资源消耗低、中文理解又好的AI模型来搭建自己的智能对话应用,那么Qwen3-0.6B绝对值得你花时间…...

维纳滤波在智能音箱中的应用:如何让Alexa听清你的声音?

维纳滤波在智能音箱中的应用:如何让Alexa听清你的声音? 在智能家居场景中,语音交互已成为最自然的控制方式。然而,当用户与智能音箱距离较远,或环境存在电视声、空调噪音等干扰时,语音识别的准确率会显著下…...

麒麟KylinOS 2303自动化安装镜像制作全攻略:从VMware配置到360浏览器预装

麒麟KylinOS 2303企业级自动化部署实战:从镜像定制到批量安装 在企业级IT基础设施管理中,操作系统批量部署的效率直接影响运维团队的工作效能。麒麟KylinOS作为国产操作系统的代表,其2303版本在企业环境中应用日益广泛。本文将深入探讨如何构…...

PETRV2-BEV模型训练指南:星图AI平台快速上手

PETRV2-BEV模型训练指南:星图AI平台快速上手 1. 从零开始:为什么选择PETRV2-BEV模型 如果你对自动驾驶技术感兴趣,一定听说过BEV(鸟瞰图)感知这个概念。简单来说,BEV就是让AI模型像鸟一样从空中俯瞰道路&…...

GCC内置函数__builtin_popcount实战:从算法优化到硬件加速的完整指南

GCC内置函数__builtin_popcount实战:从算法优化到硬件加速的完整指南 在计算机科学的底层世界中,位运算以其极致的性能成为系统编程、算法优化和嵌入式开发的核心工具。其中,人口计数(Population Count)——即统计二进…...

罗茨鼓风机主流品牌全景解析:国内市场格局与选型指南

罗茨鼓风机作为工业领域关键的动力设备,其品牌选择直接影响系统运行效率与长期运营成本。经对国内市场的系统性调研,当前主流品牌可分为两大阵营:第一阵营包括陕鼓动力(中国驰名商标持有者,技术积淀深厚)、…...

即插即用系列 | CVPR 2026 | SCFM:双路并行调制!空间-通道协同增强,高频细节精准补偿,性能轻量兼得! | 代码分享

0. 前言 本文介绍了SCFM空间-通道特征调制器,其通过双路并行注意力架构,分别从空间与通道两个维度协同增强特征表达,首次在视觉状态空间模型中实现对聚类过程中高频细节损失的有效补偿,精准破解了全局建模与局部细节不可兼得的难…...

ClaudeCode开发环境完整版

Claude Code 开发环境搭建与项目初始化 适用系统:Windows 10 / Windows 11 本文档整合以下内容: Claude Code 安装VSCode 插件Windows 快捷命令项目初始化XX配置Codex 初始化Claude Code 常用命令Context7 MCP 文档增强一、安装 Node.js Claude Code 依赖…...

即插即用系列 | CVPR 2026 | CCSM:创新Mamba块!打破像素级扫描桎梏!首创聚类中心状态空间建模,实现UHD图像修复效率与精度的双重飞跃! | 代码分享

0. 前言 本文介绍了CCSM(Cluster-Centric Scanning Module)聚类中心扫描模块,其通过创新的“特征聚合分数扩散”双阶段机制,首次在视觉状态空间模型中实现从像素级串行扫描到聚类中心级并行推理的根本性范式转变,有效…...

Pyside6快速入门:从环境搭建到第一个GUI应用

1. 为什么选择Pyside6开发GUI 如果你正在寻找一个既强大又简单的Python GUI开发工具,Pyside6绝对值得考虑。我第一次接触Pyside6是在一个需要快速开发跨平台桌面应用的项目中,当时对比了Tkinter、PyQt和Pyside6,最终选择了后者,原…...

基于博途1200PLC + HMI的自动轧钢机控制系统仿真之旅

基于博途1200PLCHMI自动轧钢机控制系统仿真 程序: 1、任务:PLC.人机界面控制自动轧钢机 2、系统说明: 系统设有启动,停止,复位 轧钢机博途仿真工程配套有博途PLC程序IO点表PLC接线图主电路图控制流程图,附赠…...

【实践指南】CasADi在模型预测控制(MPC)中的高效应用

1. 为什么选择CasADi做模型预测控制? 第一次接触模型预测控制(MPC)时,我被各种复杂的数学推导和实时计算需求搞得头大。直到发现CasADi这个神器,才真正体会到什么叫"用Python玩转控制算法"。CasADi最吸引我的…...

Asian Beauty Z-Image Turbo 模型原理浅析:LSTM在序列生成中的角色

Asian Beauty Z-Image Turbo 模型原理浅析:LSTM在序列生成中的角色 最近在体验一些图像生成模型时,我发现一个挺有意思的现象。像Asian Beauty Z-Image Turbo这类主打特定风格和快速生成的模型,虽然核心架构肯定是基于当下最流行的Transform…...

Dify异步处理插件安装失败率下降76%的关键操作:GPG密钥绑定、离线bundle构建与CI/CD流水线嵌入技巧

第一章:Dify自定义节点异步处理插件下载与安装概述Dify 平台通过自定义节点(Custom Node)机制支持扩展工作流能力,其中异步处理插件可显著提升长耗时任务(如大模型推理后处理、文件转换、外部 API 轮询等)的…...

终极指南:如何在Linux系统上安装和优化Realtek 8852CE无线网卡驱动

终极指南:如何在Linux系统上安装和优化Realtek 8852CE无线网卡驱动 【免费下载链接】rtw89 Driver for Realtek 8852AE, an 802.11ax device 项目地址: https://gitcode.com/gh_mirrors/rt/rtw89 你是否曾经在Linux系统上遇到过Wi-Fi 6无线网卡无法正常工作的…...

如何快速转换加密音频:ncmppGui完整使用教程

如何快速转换加密音频:ncmppGui完整使用教程 【免费下载链接】ncmppGui 一个使用C编写的转换ncm文件的GUI工具 项目地址: https://gitcode.com/gh_mirrors/nc/ncmppGui 你是否曾在网易云音乐下载了喜欢的歌曲,却发现只能在特定播放器中播放&#…...

AI Coding工具分析项目结构:代码量会影响分析准确性吗?

AI Coding工具分析项目结构:代码量会影响分析准确性吗? 更多问题讨论和资料获取,请关注文章最后的微信公众号随着AI编程助手成为开发者的日常工具,一个关键问题浮出水面:当项目代码量庞大时,AI的分析能力是…...

基于llm-compressor的Qwen2.5-1.5B-Instruct模型INT8量化实战指南

1. 为什么需要量化Qwen2.5-1.5B-Instruct模型 当你第一次接触大语言模型时,可能会被它的体积吓到。就拿Qwen2.5-1.5B-Instruct来说,这个拥有15亿参数的模型,原始大小接近6GB。在实际部署时,这会导致三个头疼的问题:显存…...

从同源策略到CORS:浏览器跨域问题的前世今生与最佳实践

从同源策略到CORS:浏览器跨域问题的前世今生与最佳实践 在Web开发的世界里,跨域问题就像一道无形的墙,既保护着用户的安全,又给开发者带来了诸多挑战。想象一下,当你精心设计的前端页面试图从另一个域名的API获取数据时…...

【Docker】国内镜像源配置全攻略:阿里云加速实战

1. Docker国内镜像源的必要性 刚开始用Docker那会儿,每次拉取镜像都像在等一场不知道什么时候会来的雨。官方镜像库在国外,下载速度经常只有几十KB/s,一个稍微大点的镜像能下半小时。后来发现国内各大云服务商都提供了镜像加速服务&#xff…...

VSCode调试利器:Turbo Console Log插件的高效使用技巧

1. 为什么你需要Turbo Console Log插件 每次调试JavaScript代码时,你是不是也经常在编辑器里疯狂敲打console.log?我刚开始写前端的时候,一个文件里能有二三十个console.log,调试完还要一个个删除,经常漏删导致测试同事…...

STM32F103驱动RC522:从零构建M1卡读写器与扇区权限管理实战

1. 项目背景与硬件准备 第一次接触RC522模块时,我被这个小巧的RFID读卡器惊艳到了——只需要几根杜邦线连接STM32,就能读取公交卡、门禁卡的数据。这次我们用STM32F103C8T6(蓝 pill开发板)搭配RC522模块,构建完整的M1卡…...

深入解析BLE GATT:从属性表到数据交互实战

1. BLE GATT协议基础入门 第一次接触BLE开发时,我被GATT这个术语搞得一头雾水。直到实际调试一个智能手环项目,才真正理解GATT就像快递公司的物流系统——它规定了数据该怎么打包、贴标签、以及如何安全送达。GATT全称Generic Attribute Profile&#xf…...

OpenClaw 搭团队太折腾?这个 Skill 一键搞定多智能体协作

作者:黄震 单个 Agent 面对复杂任务时存在明显局限:一个 Agent 很难在所有环节都做到最好,而且把所有任务塞进一个 Agent,会导致 Prompt 过长、注意力分散。多智能体协作通过专业分工解决这些问题:每个 Agent 专注自己…...

核桃编程携手阿里云 RocketMQ 打造高可靠、弹性可扩展的在线教育消息中枢

作者:九通、复礼、文婷 核桃编程:青少年编程教育领先企业面临的核心挑战 核桃编程是青少年编程教育行业的领先企业。自 2017 年 8 月成立以来,核桃编程通过打造智能实操产品与服务矩阵,发展成为了包含编程系列产品、编程硬件、赛级…...

‌LTST-C171TGKT‌ 是什么芯片? LED发光二极管 LITE-ON(光宝)进口芯片IC全新原装

‌LTST-C171TGKT‌ 是一款由 LITE-ON(光宝)生产的翠绿色表面贴装LED发光二极管,该型号采用0805(2012公制)封装,主波长为525nm,视角达130,以其高亮度、宽视角和低功耗特性&#xff0c…...

计算机毕业设计springboot投资担保管理系统 基于SpringBoot的融资担保业务管理平台 基于Java的金融投资风控与担保系统

计算机毕业设计springboot投资担保管理系统57mtt9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着金融市场的快速发展和数字化转型的深入推进,传统投资担保业务面…...