Vue 组件拆分笔记

Vue 组件拆分笔记

Vue 项目写到后面,最容易失控的不是语法,而是组件边界。一个页面组件如果同时负责请求、状态、表单校验、弹窗、表格和样式,后续改一点东西都会变得很痛苦。

什么时候该拆组件

可以按三个信号判断:

  • 模板超过一屏,已经不方便阅读。
  • 某块 UI 在多个页面重复出现。
  • 一个组件里有多组互不相关的状态。

不要为了拆而拆。组件拆分的目标是让页面更清楚,不是制造更多文件。

推荐拆分方式

页面组件负责组织流程:

ProjectPage.vue
├── ProjectToolbar.vue
├── ProjectTable.vue
├── ProjectEditorDialog.vue
└── useProjects.ts

页面组件关心“先请求数据,再展示列表,点击编辑打开弹窗”。具体按钮、表格、弹窗内部细节交给子组件。

props 和 emits

子组件不要偷偷改父组件的数据。父组件传入 props,子组件通过 emit 通知变化:

const props = defineProps<{
  title: string;
  loading?: boolean;
}>();

const emit = defineEmits<{
  save: [value: string];
}>();

这能让数据流更清楚,也方便排查 bug。

composable 放什么

useXxx.ts 适合放可复用逻辑:

  • 请求与刷新
  • 查询条件状态
  • 分页状态
  • 表单提交逻辑

不要把所有业务都塞进 composable。和 UI 强绑定的逻辑留在组件里反而更直观。

命名习惯

  • 页面:ProjectPage.vue
  • 业务块:ProjectTable.vue
  • 弹窗:ProjectEditorDialog.vue
  • 组合逻辑:useProjects.ts

名字要能让人一眼知道文件负责什么。

组件拆分的关键是边界稳定。页面管流程,子组件管展示,composable 管可复用逻辑。




Enjoy Reading This Article?

Here are some more articles you might like to read next: