Skip to content

介绍

vito 是一套面向 Vue 3 的 声明式 CRUD 方案,由两个包组成:

定位UI 依赖
@uozi/vito-coreHeadless hooks / types / utils
@uozi/vito-naive-uiNaive UI 适配层 + 组件naive-ui ^2.43

解决什么问题

后台管理系统中 80% 的页面都是"搜索 + 列表 + 新增/编辑表单"。每次从零写一个 CRUD 页面需要处理:

  • 分页、排序、查询状态管理
  • 搜索表单 ↔ 列表联动
  • 新增/编辑表单的 model 管理、dirty 检测、提交数据裁剪
  • 行选择、批量操作
  • URL query 同步(可分享链接)
  • 表格列渲染、字段控件映射

vito 将这些能力抽象为一组可复用的 hooks + schema,让你只需声明 adapter(数据层) + fields/columns(UI 描述)即可生成完整页面。

架构设计

┌─────────────────────────────────────────────────┐
│                  你的业务页面                     │
│                                                 │
│   ┌─────────────────────────────────────────┐   │
│   │         @uozi/vito-naive-ui             │   │
│   │   AutoCrud / CrudSearch / CrudTable /   │   │
│   │   CrudForm / Controls / Renderers       │   │
│   └──────────────────┬──────────────────────┘   │
│                      │                          │
│   ┌──────────────────▼──────────────────────┐   │
│   │           @uozi/vito-core               │   │
│   │   useCrudList / useCrudForm /           │   │
│   │   useCrudSelection / useCrudRouteSync / │   │
│   │   useCrudActions                        │   │
│   │   CrudAdapter / CrudField / CrudColumn  │   │
│   └──────────────────┬──────────────────────┘   │
│                      │                          │
│   ┌──────────────────▼──────────────────────┐   │
│   │         CrudAdapter(你来实现)           │   │
│   │   list / create / update / remove /     │   │
│   │   export / getId                        │   │
│   └──────────────────┬──────────────────────┘   │
│                      │                          │
│              你的后端 API / 数据源                │
└─────────────────────────────────────────────────┘

核心思路

  1. Adapter 隔离数据层CrudAdapter 是唯一需要你实现的接口,所有 UI 层只依赖它。切换后端 API 只需换一个 adapter。
  2. Headless hooks 管理状态@uozi/vito-core 的 hooks 不渲染任何 UI,只管理响应式状态和副作用(分页、查询、表单、选择等)。
  3. Adapter 层映射 UI@uozi/vito-naive-ui 将 core 的 schema(CrudField / CrudColumn)映射到 Naive UI 组件,提供即插即用的 AutoCrud 等组件。

两种使用方式

一把梭:AutoCrud

适合"标准 CRUD"场景,一个组件搞定搜索 + 列表 + 表单 + 操作按钮:

vue
<AutoCrud
  :adapter="adapter"
  :fields="fields"
  :columns="columns"
  search-query-key="search"
  form-mode="modal"
  show-selection
/>

自由组合:hooks + 子组件

当你需要完全掌控布局和交互时,可以直接使用 hooks 和子组件:

ts
const list = useCrudList({ adapter })
const form = useCrudForm({ fields })
const selection = useCrudSelection({ rows: list.rows, getId: adapter.getId })
vue
<CrudSearch :list="list" :fields="fields" />

<CrudTable :list="list" :columns="columns" :selection="selection" />

<CrudForm :form="form" :fields="fields" display-mode="drawer" />

与其他方案的对比

特性手写 CRUDProTable 类组件vito
数据层可复用每页重写通常耦合 UIAdapter 隔离
UI 框架绑定绑定强绑定core 无绑定
使用粒度完全自由组件级hooks → 组件均可
类型安全取决于你通常较弱泛型贯穿
学习成本低(渐进式)

下一步

Made with VitePress