一、Composition API 不是把代码都塞进 setupVue3 的组合式 API 解决了 Options API 在复杂组件里逻辑分散的问题但也带来常见问题状态、请求、监听、表单校验都堆进setup组件变成几百行。它的价值在于按业务能力组织代码而不是换写法继续堆组件。判断是否该抽 composable可以看三个信号能否跨组件复用是否包含独立副作用是否能单独测试。只为少写几行而抽函数会让状态来源变模糊。组件负责视图结构和交互编排数据获取、分页、筛选可拆出去。内容建议位置原因页面布局.vue组件贴近模板表格分页composable复用用户信息Pinia跨路由共享请求封装api 模块拦截和测试二、把列表页逻辑抽成 composable下面是一个订单列表 composable。它管理查询条件、加载状态、分页和请求。组件调用useOrderList后把状态绑定到模板。真实项目里fetchOrders应来自独立 api 模块。import{reactive,ref}fromvuetypeOrder{id:numberstatus:stringamount:numbercreatedAt:string}typeQuery{keyword:stringstatus:stringpage:numberpageSize:number}exportfunctionuseOrderList(){constloadingref(false)constrowsrefOrder[]([])consttotalref(0)constqueryreactiveQuery({keyword:,status:,page:1,pageSize:20,})asyncfunctionload(){loading.valuetruetry{constresawaitfetchOrders({...query})rows.valueres.items total.valueres.total}finally{loading.valuefalse}}functionsearch(){query.page1returnload()}return{loading,rows,total,query,load,search}}组件侧保持简单。模板和交互在组件里数据逻辑放到 composable。script setup langts import { onMounted } from vue import { useOrderList } from /composables/useOrderList const { loading, rows, total, query, load, search } useOrderList() onMounted(load) /script三、全局状态不要滥用Pinia 很好用但不是所有状态都要放全局。搜索框、弹窗开关、当前页码属于局部状态用户信息、权限、主题更适合放 store。import{defineStore}frompiniaexportconstuseUserStoredefineStore(user,{state:()({id:0,name:,roles:[]asstring[],}),getters:{isAdmin:(state)state.roles.includes(admin),},actions:{asyncloadCurrentUser(){constuserawaitfetchCurrentUser()this.iduser.idthis.nameuser.namethis.rolesuser.roles},},})store 里的 action 也要控制职责。它可以加载当前用户但不应该直接操作页面表格的筛选条件。四、组件拆分要按交互边界Vue 组件不是越碎越好。一个按钮、一行文字都拆组件会让项目充满透传 props 和事件一个页面全写在一起也难维护。合理边界是业务含义、交互状态、复用和测试。OrderPage.vue ├─ OrderFilters.vue ├─ OrderTable.vue └─ OrderDetailDrawer.vue实践建议Vue3 项目先约定状态放置规则再写组件。页面局部状态留在组件或 composable跨页面状态放 Pinia请求放 api 模块表单和表格抽 composable。组合式 API 的重点是让逻辑有边界。如果你正在学习云原生或搭建个人项目推荐试试腾讯云轻量应用服务器新用户专享优惠一键部署开发环境非常方便点击查看优惠