一、Vue Class Component:从 "选项式" 到 "类式" 的进化
Vue 2.x 时代,开发者用选项式 API(data、methods 分开写)管理大型项目时,代码容易变得零散。Vue Class Component 借鉴后端语言的 "类" 概念,让组件代码可以像这样写:
// 以前要分开写的data和methods,现在都在一个class里
@Component
export default class Counter extends Vue {
count = 0; // 直接定义数据
increment() { this.count++; } // 直接定义方法
}
这种写法有啥好处?
- TypeScript 更友好:变量类型一目了然,写代码时 IDE 能给更准确的提示
- 代码更规整:生命周期钩子(created、mounted)直接作为类的方法,不用在不同选项里跳来跳去
- 逻辑复用更简单:通过类继承就能复用父组件的逻辑,比原来的 Mixin 更清晰
二、vue-property-decorator:给类组件加点 "语法糖"
为了让类组件写起来更爽,社区又搞出了 vue-property-decorator,用装饰器(@符号开头的语法)简化各种操作:
| 装饰器 | 作用 | 例子 |
|---|---|---|
@Prop | 定义组件属性,带类型检查 | @Prop(Number) age!: number |
@Watch | 监听数据变化 | @Watch('name') onNameChange() |
@Emit | 触发自定义事件 | @Emit('save') submitForm() |
@Provide | 跨层级传递数据(替代 Vuex 的轻量方案) | @Provide() user = 'admin' |
用了这些装饰器,组件代码会更像 "声明式" 的,比如定义一个接收 message 属性的组件:
@Prop(String) message!: string; // 比原来在props选项里写对象简洁多了
三、Vue 3 来了,类组件 "失宠"?
Vue 3 推出了 Composition API(组合式 API)和 <script setup> 语法,官方更推荐用函数式的方式组织代码。这导致:
-
类组件不再是官方推荐方案:Vue 3 文档里基本不提类组件了
-
工具支持出问题:
- Vetur 插件:写
<script>里的代码没问题,但<template>里的变量没有类型提示 - Volar 插件:虽然支持类型提示,但大型项目里经常卡顿(加载中转圈圈)
- Vetur 插件:写
结果就是很多老项目陷入两难:想升级到新语法,成本太高;继续用类组件,开发体验又不好。
四、Vue Decorator Language Service:救星来了!
为了解决老项目的痛点,我开发了这个新插件,主要有以下改进:
-
模板里的代码也有智能提示
以前在<template>里写组件属性(比如<MyComponent :age="user.age" />),不知道这个age到底该传啥类型。现在鼠标放上去就能看到提示,点击还能跳转到@Prop定义的地方。 -
性能优化
用 Rust 语言重写了核心解析逻辑,不再像 Volar 那样频繁卡顿,编辑大型项目时更流畅。 -
未来功能规划
- 支持
<style>里的 CSS 类名补全 - 插槽(slot)也能有类型提示
- 自动检查必传属性(
@Prop({ required: true }))是否有传
- 支持
五、开发者该怎么选?
-
新项目:直接用
<script setup>+ Composition API,享受 Volar 插件的完整支持 -
老项目:
- 小项目:慢慢迁移到新语法
- 大项目:先用 Vue Decorator Language Service 插件稳住开发效率,再逐步还 "技术债"
结语
类组件虽然在 Vue 3 里不再是主角,但它教会了我们 "结构化组织代码" 的思路,这对写复杂项目依然有参考价值。新插件的出现,也让老项目的维护者松了一口气 —— 至少不用一边写代码一边被 IDE 的卡顿折磨了。