痛点

项目初期组件写得很快,半年后常见症状是:

  • props 越加越多
  • 事件命名混乱
  • 业务逻辑散在模板与组件里

要解决这些问题,关键是建立稳定的组件边界。

用 defineProps 和 defineEmits 明确契约

const props = defineProps<{
  modelValue: string
  disabled?: boolean
}>()

const emit = defineEmits<{
  (e: "update:modelValue", val: string): void
  (e: "submit"): void
}>()

契约清楚后,重构成本会明显降低。

分离容器组件与展示组件

  • 容器组件负责数据获取、状态管理
  • 展示组件只关心渲染和交互事件

这能避免“万能组件”不断膨胀。

组合式函数复用逻辑

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

把重复逻辑提炼到 composable,比 mixin 更直观也更可控。

结语

Vue3 + TS 的上限很高,但前提是组件契约、职责边界、逻辑复用这三件事先做好。代码会更稳,也更容易协作。