← 返回文章列表
所属专题:AI 外骨骼

Tab 一闪,接口打两份工?我让 AI 当嘴替对齐 KeepAlive,把自己从生命周期鬼打墙里拽出来

更新于 2025-11-26年份:2025字数:2,480阅读时长:8 分钟

线上 Tab 一切换,同一接口像复读机连打两遍——前端嫌烦,后端嫌吵。这篇不写复盘八股,只记我怎么把 Network、最小复现和几段模板丢给模型排假设,自己留着断点盖章;顺带弄清 KeepAlive 和动态 component :is 到底谁在演谁,最后用 v-show + 业务 key 收口,少听一半生命周期鬼故事。

TL;DR · 核心结论

  • 1模型当文员用:现象、代码块、文档小节贴过去,先换一张假设清单,少刷十篇互相复制的博客。
  • 2大实话一句:它在猜下一个 token 像不像人话;RAG 顶多把参考书摊桌上,不替你担保正确。
  • 3落地:Tab 抖动用 v-show;真·换世界再上业务 key;mounted 别当万能插座,该用 `onActivated` 的别装没看见。

上午十点,群里的 @全体成员 比咖啡醒脑:“切个 Tab,接口怎么齐步走两次?卡得像喉咙里有痰。” 我瞄了眼 Network,两条请求并排躺着,姿势整齐,像我刚才心里默念的 “KeepAlive 应该很懂事啊” 被人当场打脸。

那几天没少跟框架斗心眼,我干脆把告警原文、父组件两段模板、文档里 KeepAlive 关键词揉成一页备忘丢给常用模型:别灌鸡汤,按优先级列可能路径,每条附上怎么证伪。 十分钟拿回一张还算干净的拓扑——`:is`、缓存 key、竞态……像有人先把白板擦了,我只用往上写第一层。

它有边界:不会替你在线上呼吸。 训练里学的是 “下文怎么接才像人写的”;你再塞点 changelog,只是把胡扯空间收窄。路线图可以快出,章还得自己盖。

下面是跟同事、跟文档、跟两次源码对过眼之后的版本;上面那段顶多算开场锣鼓。


案发现场

一、案发现场:双倍请求不是灵异事件

首页两个 Tab:“门票 Ticket” 和 “周边 Life”。初代写法很克制,也很天真:

<!-- 父组件容器 -->
<KeepAlive>
  <component :is="activeTab === 'ticket' ? Ticket : Life" />
</KeepAlive>

我心想:包了 `KeepAlive`,实例怎么也得像长住客,顶多出门抽根烟。结果一切 Tab,子组件跟第一天入职似的重新 onMounted。 请求写在这里?来都来了,再薅一把。

那一刻我才听懂用户说的 “卡”:不一定慢在动画,可能慢在接口带薪加班。


抽丝剥茧

二、把锅扶稳:缓存到底在缓存谁

这部分不装读过十万行 runtime,只写我和文档对齐之后的结论:

换的是组件类型,不是 “幕布后拎人”。 A、B 两个定义轮流上,卸载再挂载是默认套餐,不等于先把实例藏屏风后面。

KeepAlive 也挑活。 不是冻龄精华抹一脸就完事;类型交替上场,语义更接近 “换剧本”,生命周期该排的队还会排。

onMounted 是扩音器。 钩子多跑几次,它就老实多干几次活——不读空气,只读调用。

指望 “KeepAlive + 不同类型 `:is`” 自动替你省心,多半属于 健身卡式自我感动:卡办了,泳圈也可能涨了。


根治方案

三、改法不玄学:v-show + 业务 key

就一句:Tab 只是躲猫猫,用样式糊弄;真要换世界观,再上 key。

1. 父组件:握紧遥控器

<!-- index.vue -->
<script setup>
const refreshKey = ref(0); // “业务户口本”版本号,别没事加一
const homeStore = useHomeStore();

watch(() => homeStore.getSocialRegionId(), (newId, oldId) => {
  if (newId && oldId && newId !== oldId) {
    // 换城市这种硬变更,才配叫推倒重来
    refreshKey.value++;
  }
});
</script>

<template>
  <!-- v-show:人还在工位,只是暂时 unseen -->
  <Ticket v-show="activeTab === 'ticket'" :key="`ticket-${refreshKey}`" />
  <Life v-show="activeTab === 'life'" :key="`life-${refreshKey}`" />
</template>

2. 子组件:别当全频段收音鸡

能挪出 mounted 的拉数,就往 props 或明确的刷新信号那儿挪。

Store 监听漫天飞的,调试时群里艾特它比艾特谁都快——让它做回安静同事比较积德。


碎碎念

四、收工前的几句人话

KeepAlive 不是万金油。 列表进详情那种深度往返它很香;同级 Tab 高频互瞟,多半是 v-show 更老实。

`onMounted` 像进场,`onActivated` 像又回台前(真跟 KeepAlive 过日子的时候别念混)。念混了,控制台里接口能凑一桌麻将。

模型能提速,不能替你签字。 假设挨个撞证据,比撞上 “感觉对了” 更有用。

收工说句俗的:重复请求少了,告警群安静得我反而不踏实。框架有脾气,模型很会猜脾气,线上背锅的是你。 不押韵,够跟下一个通宵的自己碰个杯。

本文属于 AI 实用主义流派 的第 4 篇肉身实战。

阅读时长:8 分钟


文档信息

版权声明:自由转载-非商用-非衍生-保持署名(CC BY-NC-ND 3.0)

原文链接:https://yijinlee.com/articles/article-9

作者:李奕锦

商业用途或修改衍生请联系授权。


李奕锦
李奕锦

全栈工程师,业余马拉松选手。

TL;DR

  • 模型当文员用:现象、代码块、文档小节贴过去,先换一张假设清单,少刷十篇互相复制的博客。
  • 大实话一句:它在猜下一个 token 像不像人话;RAG 顶多把参考书摊桌上,不替你担保正确。
  • 落地:Tab 抖动用 v-show;真·换世界再上业务 key;mounted 别当万能插座,该用 `onActivated` 的别装没看见。
Tags:Vue 3KeepAlive动态组件v-show生命周期人机协作排查

该专题下的阅读路径

AI Coding架构排障

常见问题 FAQ

Q1. 为什么包了 KeepAlive,切 Tab 还是会跑 onMounted?
`<component :is="..." />` 在 Ticket、Life 两种**组件类型**之间切,框架眼里更像 “换主演”,不是 “同一个演员去幕后抿口茶又回来”。KeepAlive 有缓存,但类型换了挂载链照样走一回;你再把拉数写进 onMounted,就等于请接口加班跳双人舞——不对,四人广场舞。
Q2. AI 能直接帮我线上定论吗?
不能替你抓包、不能替你跟后端拍桌。它适合把症状揉成能检索的那段话,并排几种坑让你按成本从低到高试。锅最后扣谁头上,还得 Network、断点、一次只改一个变量——模型给导航,油门在你脚下。
Q3. 想少打点请求,又不想放弃 Tab,怎么办?
用 v-show 把两个视图都养在 DOM 里,只是 display 藏起来;**城市、账号这种硬变更**再让父组件 `refreshKey++`,用 key 精准重生。别把 “用户快速瞥了眼隔壁 Tab” 当成 “宇宙要重启”。

发表评论

分享你的想法和反馈

支持 Markdown 格式

0/5000