返回文章归档
Field Note

Vue3 项目里,什么时候我会优先写 composable,什么时候不会

Vue3 的 composable 很好用,但不是所有重复逻辑都值得立刻抽。本文结合请求、表单、弹窗、权限判断和页面级状态这些常见场景,聊聊我现在怎么判断一段逻辑应该抽成 composable,还是先老老实实留在组件里。

Aa
发布
2026-05-12
阅读
3 分钟
展开文章目录

Vue3 推出 Composition API 之后,composable 很快就成了很多项目里的默认解法。它确实能把逻辑组织得更清楚,但我现在越来越少把“代码一重复”就等同于“立刻抽 composable”。很多时候,抽得太早,反而会把本来很好懂的业务逻辑拆得更散。

我会先问三个问题

在决定要不要抽 composable 之前,我通常会先问自己三件事:

  1. 这段逻辑是不是会被多个地方复用。
  2. 这段逻辑有没有稳定的输入和输出。
  3. 抽出来之后,调用方会不会更容易读,而不是更绕。

如果这三个问题里有两个以上答不上来,我一般不会急着抽。

适合抽成 composable 的场景

有些逻辑天然就很适合抽出来,因为边界清楚,而且和页面结构没有强耦合。

  • 列表请求与分页
  • 搜索条件同步
  • 元素可见性监听
  • 倒计时和轮询
  • 权限判断和按钮显隐

这类逻辑通常都有明确的状态、动作和生命周期,用 composable 收起来以后,页面会干净很多。

ts
export function usePagination() {
  const page = ref(1)
  const pageSize = ref(10)
  const setPage = (value: number) => {
    page.value = value
  }
 
  return { page, pageSize, setPage }
}

不适合硬抽的场景

如果一段逻辑和当前页面的业务语义绑得很紧,我反而更倾向先留在组件里。

例如:

  • 只在当前弹窗里生效的表单联动
  • 只服务一个页面的临时交互
  • 依赖大量模板上下文的判断
  • 还在频繁变化中的需求逻辑

这类代码最大的问题,不是重复,而是不稳定。你今天刚抽出来,明天就因为另一个页面规则不同,又开始到处加参数、塞选项,最后 composable 本身反而更难维护。

我不想看到的 composable 长什么样

如果一个 composable 出现这些信号,我会重新评估:

  • 参数越来越多
  • 返回值越来越杂
  • 里面夹着很多页面专属文案
  • 调用方还得知道一堆内部细节才能正确使用

这种时候,它已经不是“复用逻辑”,而是在制造新的抽象负担。

一个更稳妥的顺序

我现在更习惯这样做:

  1. 先把逻辑在一个组件里跑顺。
  2. 等第二个、第三个相似场景真的出现。
  3. 再根据共同部分去抽 composable。

这样抽出来的东西,通常更贴近真实复用,而不是凭感觉设计出来的“未来接口”。

结语

composable 真正的价值,不是让代码看起来更高级,而是让逻辑边界更清楚。该抽的时候抽,能明显减轻页面负担;不该抽的时候硬抽,只会把业务理解成本转移到别的文件里。对我来说,能不能让后来接手的人一眼看懂,始终比“抽得优不优雅”更重要。

阅读完成

读到这里,谢谢你。

如果这篇文章对你有帮助,可以分享给同样在解决这个问题的人。

阅读记录

2026-05-12

3 分钟阅读