组件 = 模板 + 业务逻辑

简介: 各位网友大家好,今天给大家推荐我刚发布的 Vue 3 开发库 —— vue-clazz-decorator。名字里的 "clazz" 是 class 的谐音梗,为什么不直接叫 `vue-class-decorator` 呢?很简单,因为这个已经有人叫了。

各位网友大家好,今天给大家推荐我刚发布的 Vue 3 开发库 —— vue-clazz-decorator

名字里的 "clazz" 是 class 的谐音梗,为什么不直接叫 vue-class-decorator 呢?很简单,因为这个已经有人叫了。

这个库就干一件事:让你用 类 + 装饰器 写 Vue 3 组件,同时把模板和逻辑彻底解开

这个库的主要特色

  • 通过类和装饰器来写 Vue 组件
  • 方便地复用模板和逻辑
  • 保证自定义类型的纯净
  • 支持多种装饰器编译方式

创建组件

这个库的核心思想就是 【组件 = 模板 + 业务逻辑】。createComponent 这个函数就是围绕这个思想设计的,在避开 Vue 3 不能用 class 组件这个限制的同时,顺便把模板和逻辑的复用也安排得明明白白。

先看看 Vue 3 里同类库的写法,往往长这样

class HelloPage {
  render() {
    return xxxxxx;
  }
}

export default toVue(HelloPage);

能用,但总觉得拧巴:

  • render 方法硬生生塞进业务类里,UI 和逻辑搅在一起,类本身就不纯粹了;
  • 外面还得套一层转换函数,多余,但又不能没有。

我换了个更干脆的思路:模板归模板,逻辑归逻辑,两者彻底分开,最后拼一下就是组件。

@ViewModel
export class CounterViewModel {
    @State
    public count = 0;

    public increment() {
        this.count++;
    }
}
export function CounterView(props: CounterViewModel) {
    return <div>
        <p>Count: {props.count}</p>
        <button onClick={props.increment}>+1</button>
    </div>;
}

export const Counter = createComponent(CounterView, CounterViewModel);

业务逻辑全在 ViewModel 里,就是个干干净净的普通类;模板就是个纯渲染函数,不碰任何业务实现。最后 createComponent 轻轻一粘,就是个标准 Vue 组件。

这么拆开之后,很多事情就顺了:

  • 业务类想单测直接实例化测,不用挂载组件、不用模拟 DOM;
  • 同一份逻辑可以配多套模板,同一份模板也能套不同逻辑;

优雅的逻辑复用

复用逻辑,直接 use() 把另一个 ViewModel 组合进来,天然带命名空间,互不干扰。

@ViewModel
export class FooViewModel {
    ... }

@ViewModel
export class BarViewModel {
   
    public foo1 = use(FooViewModel);
    public foo2 = use(FooViewModel);
}

分页、筛选、弹窗这类通用逻辑,抽一次就能到处用,依赖关系明明白白。

组件生命周期:灵活且不设限

使用注解声明生命周期方法,不强制固定方法名。更爽的是,一个生命周期钩子可以绑定多个方法,进一步保证了类的纯净度和内聚性

@ViewModel
export class FooViewModel {
   
    @OnDidCreate
    protected init() {
   
        console.log("ViewModel created");
    }

    @OnDidMount
    protected fetchData() {
   
        console.log("拉数据");
    }
    @OnDidMount
    protected initDict() {
   
        console.log("初始化字典");
    }
}

数据模型 + 元数据能力

前面说的 ViewModel 是管组件逻辑的,那纯数据呢?前端处理后端 JSON 时往往需要许多转化规则。于是我干脆把模型层也一并做进库里了,从接口数据到业务实例,一条龙用 Class + 装饰器搞定。

模型层声明

@Model 标记一个数据模型类,字段的映射规则、格式化、类型转换全用装饰器写在类上。后端返回的原始数据,丢进 reactive() 直接就是带类型、带业务方法的响应式实例,再也不用自己手写转换函数了。

@Model
export class UserBo {
   
    @JsonProperty("user_id")  // 下划线字段自动映射
    public id: string;

    @JsonFormat("yyyy-MM-dd") // 日期自动格式化解析
    public birthday: Date;

    @Type(Dept)               // 嵌套对象自动实例化
    public dept: Dept;
}

// 后端原始数据直接转成响应式模型实例
const user = reactive(response.data, UserBo);

自定义注解,扩展性拉满

库内置了完整的元数据系统,你可以像 Java 那样自己写注解,给字段打标签,运行时直接读取配置。

做动态表单、配置化表格、低代码页面的时候特别好用 —— 模型类写完,表单和表格直接照着元数据自动渲染,不用重复写配置。

// 一行代码定义一个自定义注解
const Label = (text: string) => metadata('label', text);
const Required = metadata('required', true);

@Model
export class UserBo {
   
    @Label("用户ID")
    @Required
    public id: string;

    @Label("用户名")
    public name: string;
}

// 运行时直接读取所有字段元数据
getMetadataValues(UserBo);
// { id: { label: "用户ID", required: true }, name: { label: "用户名" } }

编译方式随便选,我都兜底了

简单说,不管你项目是 TS 还是 Babel,是老版装饰器还是新提案,直接装上就能跑,不用为编译环境折腾配置。内部 6 套 vitest 配置覆盖了这些组合,不是写着玩的。

编译方式 proposal experimental experimental + emitMetadata
typescript ✅ 支持 ✅ 支持 ✅ 支持
babel ✅ 支持 ✅ 支持 ✅ 支持

常见问题

Q:内部用的是 setup 还是 Options API?

纯 setup 实现,所有测试都是在 __VUE_OPTIONS_API__: false 环境下跑的。ViewModel 不是 Vue 的子类,就是个被 setup () 消费的普通 class 实例。

Q:有 React 版吗?

有,但 React 版是我公司内部用的。这次开源的 Vue3 版本,是我吸取了之前 React 版的经验教训,完全重构的,设计上更成熟。

Q:你这刚发布的东西,能直接上生产吗?

不建议。

如果你认同我的设计思路,我的建议是:可以先点个关注、收个藏。等我把上层管理端和移动端的框架都完整重构到 Vue3 上的时候,才是我真正推荐大家上手用的时候。

这只是整个方案的底层基石,后面还有更上层的东西要放出来。


最后

项目刚发,还热乎着。

欢迎去仓库逛逛,有想法、有 bug 都可以提。更欢迎点个 Star 蹲后续,等上层框架出来了,直接上手成品体验会好得多。

目录
相关文章
|
1天前
|
云安全 人工智能 运维
阿里云SecOps Agent,全新安全跨产品执行体验
自然语言驱动 云安全中心/WAF/CFW/ 等多款安全产品联动
1566 0
|
11天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。
|
12天前
|
JavaScript 定位技术 API
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
CodeGraph 是一款爆火的本地代码智能工具,通过 tree-sitter 解析 AST 构建结构化知识图谱(存于 SQLite),为编程 Agent 提前生成“代码地图”。它显著降低 Agent 在中大型项目中的探索成本——实测工具调用减少71%、Token 降57%、速度提升46%,支持19+语言及主流框架路由识别,完全离线、无需 API Key。
854 11
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
|
12天前
|
人工智能 运维 JavaScript
阿里云Qoder CN(原通义灵码)全解析 产品形态、版本划分与技术适配说明
在AI辅助开发与智能办公工具持续普及的当下,阿里云旗下原通义灵码正式更名为Qoder CN,同时延伸出QoderWork CN、Qoder CN CLI、Qoder CN Mobile等多款配套产品,形成覆盖代码开发、日常办公、终端交互、移动端使用的完整工具矩阵。Qoder CN核心定位为AI智能编码助手,深度适配主流代码编辑器、集成开发环境以及终端场景;QoderWork CN则偏向桌面端综合办公辅助,二者面向不同使用场景,划分了多个版本档位,搭配差异化资源配额、功能权限与计费规则,同时兼容多款主流大模型。
881 8
|
1天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
344 2
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
12天前
|
JSON 缓存 安全
通过 CC Switch 本地路由让 Codex CLI 接入 DeepSeek 等第三方模型
CC Switch 通过本地路由(`127.0.0.1:15721`)实现协议转换:将 Codex 的 Responses API 请求自动映射为 DeepSeek 等厂商的 Chat Completions 接口,兼容流式响应与工具调用,无需修改 Codex 源码,安全隔离 API Key。(239字)
2405 7
通过 CC Switch 本地路由让 Codex CLI 接入 DeepSeek 等第三方模型
|
12天前
|
存储 安全 Java
AgentScope Java 2.0:打造分布式、企业级智能体底座
AgentScope 2.0 面向分布式部署、稳定运行、权限安全等企业级需求全面升级,打造支持多租户隔离与长期稳定运行的企业级智能体底座。
|
8天前
|
人工智能 自然语言处理 算法
阿里云百炼Qwen 3.7 Plus与Max实测全解:性价比与多模态能力、成本深度对比
2026年,阿里云百炼平台推出的Qwen 3.7系列成为企业与开发者落地AI应用的核心选择,其中Qwen 3.7 Max与Plus作为两大旗舰版本,定位差异显著:Max是纯文本推理旗舰,专注高强度智能体与复杂逻辑任务;Plus则是多模态全能版,在保留强大文本能力的同时,补齐图像、视频理解能力,且价格大幅降低。本文基于2026年最新实测数据,从核心参数、文本能力、多模态能力、智能体表现、性价比与场景选型六大维度,全面解析两款模型的差异,为用户提供精准选型参考。
427 0