vue前端框架讲师丁延强

丁延强讲 Vue 的端框时候,第一句话经常是架讲:“别背 API,先想清楚数据怎么流。师丁”这话听起来简单,延强但很多学了半年 Vue 的端框人,写出来的架讲组件依然是一锅粥。他带过的师丁学生里,有个从 Java 转过来的延强后端,刚开始把每个方法都写成 `this.$refs.xxx` 去操作 DOM,端框丁延强没直接批评,架讲而是师丁让他把同样的功能用 `v-model` 重写一遍。改完以后,延强那个学生自己说:“原来我之前一直在用 Vue 写 jQuery。端框”

他上课有个习惯,架讲白板上永远画着三样东西:一个方框代表数据,师丁一个箭头代表更新,另一个箭头代表渲染。讲 `v-if` 和 `v-show` 的区别,他不列对比表,而是问:“你家里灯坏了,你是把灯泡拧下来,还是拿块布盖上?”学生笑,然后他说:“`v-if` 是拧灯泡,`v-show` 是盖布。灯泡拧多了,灯座会松。”这个比喻他用了五年,每届学生都记得住。

关于响应式原理,丁延强不太爱讲 `Object.defineProperty` 和 `Proxy` 的源码细节。他更愿意花时间让学生亲手制造一个“数据变了但页面没变”的 bug。有个女生做购物车,总价怎么都不更新,查了两小时,最后发现是在数组里直接改了 `item.price`,没走 `Vue.set`。丁延强说:“这个坑你踩过一次,比听我讲十遍都管用。”后来那个女生去了字节,做前端基建,偶尔还会在微信上问他 Vue3 的 `effect` 嵌套问题。

他反对一上来就讲 `Vuex` 和 `Pinia`。他的逻辑是:先让组件之间用 `props` 和 `emit` 传数据,传得你烦了,再引入状态管理。有个小组做后台管理系统,父子组件传了七层,代码里全是 `$emit` 链。丁延强没让他们立刻重构,而是让他们数一数,一个按钮点击到数据更新,中间经过了多少个组件。数完以后,组长自己说:“我们是不是该用 provide/inject 或者直接上 Pinia 了?”丁延强点头:“对,但你现在知道为什么需要它了。”

讲 Vue Router 的时候,他喜欢拿地铁线路图打比方。`routes` 数组就是线路图,`router-link` 是站台指示牌,`router-view` 是列车本身。动态路由匹配,他说是“区间车,不同站停不同门”。导航守卫呢?“安检口,有的站进站查,有的出站查。”学生听完了,再去看官方文档,那些 `beforeEach`、`afterEach` 的钩子函数就不那么抽象了。

丁延强自己写代码有个怪癖:组件文件名永远用大驼峰,但模板里引用时用短横线。有人问他为什么不统一,他说:“文件是给编辑器看的,标签是给浏览器看的。各走各的道,别互相添乱。”这种细节他抠得很死,但从不强迫学生接受。他常说:“风格可以吵,逻辑不能错。”

去年有个学生面美团,被问到 `computed` 和 `watch` 的区别。学生没背定义,而是说:“computed 像自动挡,你踩油门它自己换挡;watch 像手动挡,你得盯着转速表自己操作。”面试官笑了,过了。学生回来告诉丁延强,他听完只说了一句:“比喻要准,别为了好玩瞎编。”

他最近在讲 Vue3 的 Composition API,但依然坚持先讲 Options API。理由是:“你得先知道 Vue 帮你做了什么,再去理解你手动控制了什么。”有个学生用 `setup` 语法糖写了个计数器,丁延强让他再用 Options API 写一遍,对比 `data`、`methods` 和 `ref`、`function` 的差异。学生写完说:“好像 `setup` 就是把东西都摊在桌面上,不藏了。”丁延强说:“对,但桌子乱不乱,看你自己。”

丁延强的课没有 PPT 动画,没有花哨的思维导图。一块白板,一支黑笔,偶尔用红笔圈个重点。他讲得最多的不是 Vue 本身,而是“你为什么要这么写”。学生毕业以后,可能忘了 `v-for` 的 `key` 怎么设,但记得他说过:“数据是河,视图是船,河往哪流,船往哪走。别反过来。”