当前安装的 Vue Router 4.6.4 运行时代码明确警告:<router-view> can no longer be used directly inside <transition> or <keep-alive>,要求使用 v-slot="{ Component }" 后把真实路由组件交给 keep-alive。因此当前结构缓存的是不受支持的承载方式,不能可靠缓存业务页面实例;这是本单的正确根因。
原工单认为 $route.path 作为 key 会在切换标签时绕过缓存,该判断不成立。Vue 3.5.41 KeepAlive 以 vnode.key 查找缓存;从页面 A 切到 B 再回 A 时,A 的 path/key 仍相同,应命中原缓存。route.path 反而能让 /dict/data/1 与 /dict/data/2 形成独立缓存实例。
cachedViews 仍由 store/modules/tagsView.js 按路由 name 维护;GoAuto 组件名与菜单名一致,no_cache=0,无需修改。
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
原始需求摘要
来源:用户于 2026-09-01 反馈,Admin 顶部标签栏(TagsView)切换标签页时,GoAuto 列表页的搜索条件会丢失(例如 tab A 搜索后打开 tab B,再切回 tab A,搜索状态被重置)。用户要求建单;2026-09-01 评审后确认原工单对
router-view key的根因判断不正确,本版按当前 Vue 3 / Vue Router 4 实现修订。目的:让顶部标签栏切换时,GoAuto 列表页及其他启用缓存的页面能够复用原组件实例,保留搜索、分页和选中状态;同时保证动态路径页面(字典数据页)按实际 path 隔离实例,不串数据。
基线与已核实事实
代码基线:
3aab1f0(2026-09-01,当前main)。核验日期 2026-09-01。web/package.json当前使用 Vue3.5.41、Vue Router4.6.4。web/src/layout/components/AppMain.vue仍采用 Vue 2 风格结构:<keep-alive :include="cachedViews"><router-view :key="key" /></keep-alive>,并把router-view直接放在keep-alive内。<router-view> can no longer be used directly inside <transition> or <keep-alive>,要求使用v-slot="{ Component }"后把真实路由组件交给keep-alive。因此当前结构缓存的是不受支持的承载方式,不能可靠缓存业务页面实例;这是本单的正确根因。$route.path作为 key 会在切换标签时绕过缓存,该判断不成立。Vue 3.5.41KeepAlive以vnode.key查找缓存;从页面 A 切到 B 再回 A 时,A 的 path/key 仍相同,应命中原缓存。route.path反而能让/dict/data/1与/dict/data/2形成独立缓存实例。cachedViews仍由store/modules/tagsView.js按路由name维护;GoAuto 组件名与菜单名一致,no_cache=0,无需修改。params.dictId形成不同实际 path;必须继续使用实际 path 作为组件 key。目标
keep-alive缓存真实路由业务组件。dictId时不串数据。非目标
tagsView.js按 name/path 维护标签与缓存列表的既有逻辑。sys_menu的menu_name、no_cache配置。route.path,由 KeepAlive 正确使用它区分缓存实例。created()读取 query 且确有 SPA 内同 path 跳转需求,单独记录或纳入直接受影响工单。前置依赖与并行性
AppMain.vue、TagsView或tagsView.js的任务并行。固定实施方案
仅修改
web/src/layout/components/AppMain.vue的路由承载结构,使用 RouterView 插槽取得真实组件:router-view使用的key()计算属性;cachedViews和appMainStyle保持不变。tagsView.js、菜单配置和业务页面。router-view。设计证据
修复不改变可见 UI 结构或控件,只纠正组件缓存行为,不需要视觉设计稿。工单验收记录必须列出验证页面、状态字段、组件挂载次数和动态 path 隔离结果。
验收标准
/dict/data/1、/dict/data/2、/dict/data/3分别形成独立实例,来回切换不串数据且各自状态保留。sys-config、sys-api等静态路径页面切换后状态正常保留。tagsView.js、sys_menu配置和 GoAuto 业务页面。必测场景
dictId的三个 path 各自修改本地状态,来回切换后分别恢复,断言没有复用错误实例。pdd-products、shopee-products、syb-products各验证搜索、分页、选中行。风险与安全门禁
AppMain.vue是全站公共容器,回归面广;不能只验证 GoAuto 页面。route.path作为 key,不能退化为仅按 route name 缓存。created();实施中发现的业务页 query 响应缺口必须记录,不能通过恢复错误缓存结构规避。文档影响
无长期文档影响。 未新增或修改接口、数据结构、业务规则、启动、部署或运维方式;属于前端公共容器行为修复。因此跳过 Wiki 更新与同步。
状态
待确认(2026-09-01 已按评审意见修正根因与方案,等待用户确认后实施)。
修复:顶部标签栏切换丢失页面状态(AppMain 的 router-view key 绑定问题)to 修复:顶部标签栏切换丢失页面状态(Vue Router 4 RouterView 缓存结构)已按用户指令开始实施。基线为 3aab1f0,范围严格限定为 AppMain.vue 的 Vue Router 4 scoped-slot 缓存结构及对应回归测试;保留 route.path 作为缓存 key,不修改 tagsView、业务页面或视觉样式。Gitea MCP 当前会话未提供,按项目规则回退 Gitea API。无长期文档影响,实施完成后跳过 Wiki 同步并回写验证证据。
实施完成,等待用户验收。
实现:
验证:
提交:b31896ef752dfae0bff9b58a447d7520a9949db3
推送:origin/main 成功。
文档影响:无长期文档影响。本次仅恢复既有标签缓存行为,不改变 API、配置、数据结构、业务规则或运维方式,因此按工单约定跳过 Wiki 更新与同步。
未执行:未发布线上;发布属于独立高风险动作,#187 当前停在待验收。