2023 年底组里的前端同事离职,我被顶上去补了半年,从只会改样式到能独立写一个完整页面。这半年最大的收获不是 Vue 本身,是终于理解了为什么以前前端同事总追着我要字段的确切类型。回头看这篇写得有点乱,但没删,就当留个记录。

一、被推上去的那天

2023 年底,组里唯一一个专职前端提了离职。那套内部系统前后端都是我们这个小团队自己维护的,他一走,前端那摊就空了。领导问我能不能先顶一阵,我想着反正 2023 年我已经零零散散碰过一点 Vue,改个样式、调个字段名总归会,就答应了。现在看,我当时对"会一点"和"能顶上"之间的距离,严重估计不足——我以为缺的只是时间,其实缺的是一整套怎么把数据接进来、怎么处理状态的经验,那些东西不是看两眼就会的。

二、第一次独立写页面的狼狈

真正独立接的第一个需求,是把一个查询页的筛选条件从三个加到七个。听起来不大,但我卡在了第一步:不知道这七个条件对应的数据从哪个接口来。以前我做后端,前端同事来问字段,我甩个 Swagger 链接就完了;这回轮到自己,才发现 Swagger 里那一长串字段,没有上下文根本分不清哪个能用、哪个是历史遗留。那一版我前后改了四遍,每次都是还在交接期的前端同事看完说"这里不对"。我当初想错了,以为"会写 Vue 模板"就等于"会做前端",其实差的是远不止写标签那一小段,是从接口到页面整条链路。 比如那七个筛选条件里有个"创建时间范围",后端返回的是字符串,我前端没转成 Date 就直接拿去比较,结果筛选完全不生效。这个问题我查了一下午,最后是对方在交接文档里写了一句"时间是字符串,记得自己转",我才反应过来。这类坑以前都是前端同事自己消化的,我作为后端从没往这方面想过,直到自己踩了才知道有多耽误事。

三、后端思维惯性带来的坑

最典型的坑是状态管理。我在后端习惯了"请求来了查库返回",到了前端总想"数据不就在那吗,直接用"。第一次做表单联动,我傻乎乎地把选项写死在前端,结果后端改了枚举值,页面就缺了一项,还查了半天才发现是硬编码的问题。后来发现,正确的做法应该是选项也走接口拿,或者至少有个明确的映射表,而不是我图省事写死。类似的还有:我一开始不爱用 computed,能算的都在方法里现算,导致一个值变了,依赖它的一大堆地方没跟着刷;还有事件我习惯用全局总线,结果两个页面共用一个事件名,点一个另一个也跟着动。这些都是后端写顺手了带过来的坏习惯。还有一次,我把一个本该用 v-model 双向绑定的输入框写成了单向,改了值页面不回显,测试同学提了 bug 我才发现,这种在后端完全不会有的概念,我是踩了坑才记住的。类似的还有组件 props 直接改了不生效、得用 emit 抛回去——这些在后端根本不存在的问题,前端全是基本功。前端同事以前大概没少替我兜底,只是我当时不知道。

四、怎么一点点补上来的

补上来的过程没什么捷径,就是硬啃。我把公司那套组件库从入口文件一行行读下来,搞清楚每个组件接收什么 props、抛出什么事件;Vue 的官方文档那阵子我翻得比技术博客勤,尤其是响应式原理那一章,看完才明白为什么我之前写的状态不刷新——原来是直接改了数组下标,Vue 2 的响应式拦不到那种改动。也试过三种组织代码的方式,最后留在组合式函数那一种:不是因为它高级,而是我们这摊活儿复用逻辑多,把请求和数据处理抽成函数,比全塞进组件里清楚,也方便我在两套系统之间搬。半年下来,从只会改样式,到能把一个完整页面从接口对接、状态处理到交互都自己写完,中间踩的坑大半数都跟"后端思维惯性"有关。

有一处我到现在也没完全想明白:有些页面我用组合式函数拆得很干净,有些急着上线就还是堆在组件里了。哪种更适合我们这种小系统,我后来倾向于"能拆就拆,但别为拆而拆",这个结论不一定对,先记着。

五、回过头看

这半年之后,2023 年起兼做 Vue 就成了我的常态——准确说,是从"偶尔帮忙"变成了"正经分担一部分前端"。再后来换到新环境,前端变成日常工作的一部分,那半年的底子至少让我没那么慌,不用每次都等后端同事有空来救。现在如果后端同事给我一个接口,我第一反应不再是"字段你定",而是会先问清楚类型、会不会变、缺省值是什么——因为我当过那个被模糊字段坑了的人。回头看这篇写得有点乱,时间线也跳,但那是当时的真实状态,没删,就当留个记录。