跳转到内容

ProDescriptions ​

使用与表格相同的字段 schema 展示单条记录,支持请求、格式化与逐字段编辑。排版属性沿用 antdv-next 的 Descriptions。

vue
<script setup lang="ts">
import { ref } from 'vue'
import { Button, Space } from 'antdv-next'
import {
  ProDescriptions,
  type ProDescriptionsColumn,
  type ProDescriptionsInstance,
  type ProKey,
} from '@bubblesjs/antv-next-pro'

interface ProjectDetails extends Record<string, unknown> {
  name: string
  owner: string
  status: string
  budget: number
  createdAt: string
  notes: string
}

const action = ref<ProDescriptionsInstance<ProjectDetails>>()
const server = ref<ProjectDetails>({
  name: '组件升级计划',
  owner: '林晓',
  status: 'active',
  budget: 16800,
  createdAt: '2026-10-21',
  notes: '先完成示例,再安排团队验收。',
})
const requests = ref(0)
const feedback = ref('点击字段旁的编辑图标;清空项目名称后保存可查看校验。')
const columns: ProDescriptionsColumn<ProjectDetails>[] = [
  {
    title: '项目名称',
    dataIndex: 'name',
    formItemProps: { rules: [{ required: true, message: '请输入项目名称' }] },
  },
  { title: '负责人', dataIndex: 'owner' },
  {
    title: '状态',
    dataIndex: 'status',
    valueType: 'select',
    valueEnum: {
      active: { text: '进行中', status: 'Processing' },
      done: { text: '已完成', status: 'Success' },
      pending: { text: '待开始', status: 'Default' },
    },
  },
  { title: '预算', dataIndex: 'budget', valueType: 'money', editable: false },
  { title: '创建日期', dataIndex: 'createdAt', valueType: 'date', editable: false },
  { title: '备注', dataIndex: 'notes', valueType: 'textarea' },
]

async function request() {
  requests.value++
  return { data: { ...server.value }, success: true }
}
async function save(_key: ProKey, record: ProjectDetails) {
  server.value = { ...record }
  feedback.value = `已保存:${record.name} · ${record.owner}`
  return true
}
</script>

<template>
  <div class="descriptions-demo" data-demo="pro-descriptions">
    <ProDescriptions
      ref="action"
      title="项目详情"
      tooltip="通过 request 获取详情,逐字段编辑并保存。"
      :columns="columns"
      :request="request"
      :editable="{ type: 'single', onSave: save }"
      :column="{ xs: 1, sm: 2 }"
      bordered
      @editable-error="feedback = '请检查字段内容后重试。'"
    >
      <template #extra>
        <Space>
          <Button data-demo-descriptions-edit @click="action?.startEditable('name')"
            >编辑名称</Button
          >
          <Button data-demo-descriptions-reload @click="action?.reload()">重新加载</Button>
        </Space>
      </template>
    </ProDescriptions>
    <p data-demo-descriptions-state aria-live="polite">已加载 {{ requests }} 次。{{ feedback }}</p>
    <pre data-demo-descriptions-data>{{ JSON.stringify(server, null, 2) }}</pre>
  </div>
</template>

<style scoped>
.descriptions-demo {
  display: grid;
  gap: 16px;
}
p {
  margin: 0;
}
pre {
  margin: 0;
  overflow: auto;
  padding: 16px;
  border: 1px solid #d9d9d9;
  border-radius: 8px;
}
</style>

最小用法 ​

vue
<script setup lang="ts">
import { ref } from 'vue'
import { ProDescriptions, type ProDescriptionsColumn } from '@bubblesjs/antv-next-pro'

type Profile = { name: string; status: string }
const profile = ref<Profile>({ name: '张三', status: 'active' })
const columns: ProDescriptionsColumn<Profile>[] = [
  { title: '姓名', dataIndex: 'name', formItemProps: { rules: [{ required: true }] } },
  {
    title: '状态',
    dataIndex: 'status',
    valueType: 'select',
    valueEnum: { active: '启用', inactive: '停用' },
  },
]
</script>

<template>
  <ProDescriptions
    title="用户信息"
    :columns="columns"
    :data-source="profile"
    :editable="{ type: 'single' }"
    @data-source-change="profile = $event"
  />
</template>

API ​

属性说明
columnsProDescriptionsColumn<T>[],每项描述一个字段
dataSource单个对象 T,不是数组
request(params: P) => Promise<{ data: T; success?: boolean }>;挂载及参数变化时请求
params请求参数;较旧的响应不会覆盖较新的结果
loading显式覆盖内部请求加载状态
title / tooltip / extra标题、标题提示、附加区域
editablefalse 或 EditableConfig<T>;配置后允许逐字段编辑,默认单字段
formProps原生编辑 Form 属性,与 editable.formProps 合并,后者优先
formRef / editable.formRefRef<FormInstance | undefined>,获得实际原生表单
actionRefRef<ProDescriptionsInstance<T> | undefined>,也可用组件 ref
emptyText空字段展示值
原生 Descriptions 属性bordered、column、size、layout 等直接使用
prefixCls / classes / styles公开前缀与语义样式
字段属性说明
key / dataIndex编辑标识优先取 key,否则从 dataIndex 派生;嵌套路径使用数组
title / label标题支持节点或 (column) => VNodeChild;省略 title 时使用 label
span / order原生描述项跨度;order 较大者优先
hide / hideInDescriptions隐藏字段
valueType / valueEnum / fieldProps与 ProField 共用展示、输入和格式化能力
request / params字段选项请求,不替代顶层记录请求
readonly / editable禁止该字段编辑;editable 也可为 (record, index) => boolean
formItemProps原生校验规则等属性,对应当前字段路径
renderText(value, record, index, action) => unknown,先转换展示值
render(dom, record, index, action, schema) => VNodeChild
formItemRender(schema, context, form) => VNodeChild;form 为原生 FormInstance

formItemRender 的 context 提供 record、index、column、editable、isEditable、recordKey、type="descriptions"、dependencies、defaultRender()、update(value)。自定义输入应调用 update 回写草稿。旧 renderFormItem(schema, context) 兼容。

编辑与事件 ​

editable.type="single" 同时只允许一个字段;multiple 允许多个字段。editable.editableKeys 受控时,需要在 editable.onChange(keys, rows) 中更新配置。

保存只校验并合入当前字段,其他编辑中的草稿不会被一并提交。editable.onSave(key, next, origin) 可返回 Promise;返回 false 或校验失败时继续编辑。取消恢复当前字段,并调用 editable.onCancel。readonly 或 editable=false 的字段不会进入编辑。

事件/回调说明
dataSourceChange(data)字段保存成功后回传完整记录;调用方决定持久化及更新数据源
requestError(error)顶层记录请求失败
editableError(error)编辑校验或回调异常
onLoadingChange(loading)请求加载状态变化
editable.onValuesChange(record, rows)编辑草稿变化

插槽与实例 ​

插槽参数与用途
title / extra替换标题、附加区域
field-${columnKey}{ record, column },替换该字段的只读内容
默认插槽追加原生 ProDescriptions.Item / ProDescriptionsItem

ProDescriptions.Item 与具名 ProDescriptionsItem 均为原生 DescriptionsItem;默认插槽中的原生项不会自动成为可编辑 schema 字段。

实例方法说明
reload(): Promise<void>用当前 params 重新请求
getData() / dataSource获取当前记录
setDataSource(data)替换内部记录及草稿;undefined 置为空对象
startEditable(key): boolean进入字段编辑;key 为字段标识
saveEditable(key): Promise<boolean>校验并保存字段
cancelEditable(key) / isEditable(key)取消编辑、检查字段状态

样式与配置 ​

classes / styles 支持对象或 ({ props }) => map,直接传给原生 Descriptions,部位名遵从其语义样式 API。旧 classNames 兼容,同部位 classes 优先。

外层公开类名默认 ant-pro-descriptions;原生 ConfigProvider 的前缀为 demo 时使用 demo-pro-descriptions,也可通过 prefixCls 覆盖。语言、方向、主题算法与原生组件 token 跟随 ConfigProvider;扩展 token 通过 ProConfigProvider 配置。

FieldRender ​

FieldRender 也可具名导入,用于组合单个描述字段。它接收 text、entity(整条记录)、action(ProDescriptionsInstance),以及 dataIndex、index、mode、valueType、valueEnum、fieldProps、request、params、dependencies 和上述自定义渲染回调。form 为自定义编辑传入原生表单,emptyText 为展示占位。

编辑变化通过 update:text 回传;字段请求失败通过 onFieldRequestError(error) 通知。该组件不创建独立表单、不负责保存,也没有额外插槽或实例方法;默认渲染使用 ProField。

基于 MIT 许可发布