Skip to content

@dragcraft/form-generator

@dragcraft/form-generator 负责根据 FormSchema 渲染配置表单。

先看一个最小示例:

vue
<script setup lang="ts">
import { FormGenerator } from '@dragcraft/form-generator'

const schema = {
  sections: [
    {
      title: '基础信息',
      fields: [
        { key: 'title', label: '标题', component: 'Input' },
      ],
    },
  ],
}

const values = { title: '首页' }

function handleFieldChange(payload: unknown) {
  console.log(payload)
}
</script>

<template>
  <FormGenerator
    :schema="schema"
    :values="values"
    :field-component-map="fieldComponentMap"
    @change="handleFieldChange"
  />
</template>

这段代码说明它只做一件事: 根据 schema 渲染字段,并把值变化通过事件抛出来。它不直接依赖 core,也不提交命令;在 dragcraft 的标准接入里,designer 会接住这些变化,再翻译成对应的 engine.execute()

FieldSchema.component

component 接受字符串键或 FieldRenderFactory

ts
type FieldRenderFactory = (ctx: FieldRenderContext) => () => VNodeChild

interface FieldSchema {
  component: string | FieldRenderFactory
}

字符串会从 fieldComponentMap 解析,并使用对应 adapter 的 model prop、更新事件与值转换。factory 不需要注册,适合只在当前表单出现的标题、分割线、只读说明和轻量操作区。

下面的字段直接渲染一条分割线,不会生成默认 label 和 control:

ts
import { h } from 'vue'

{
  key: '__basic-divider',
  label: '',
  component: ({ t }) => () =>
    h('div', { class: 'my-form-divider' }, t('form.basic', '基础设置')),
}

factory 自己负责完整字段内容,外层仍保留 visibleifShowshowdisabledspan、tooltip 和校验错误等字段语义。

函数值的解释规则

component 中的函数始终按 FieldRenderFactory 解释。Vue 函数式组件必须先注册到 fieldComponentMap,再通过字符串键使用;需要 JSON 序列化的 FormSchema 也应使用字符串键。

FieldRenderContext

factory 在字段 setup() 中执行一次。它收到的计算引用和 values 保持响应式,返回的 render 函数可以在每次渲染时读取最新状态。

ts
interface FieldRenderContext {
  field: ComputedRef<FieldSchema>
  values: Record<string, unknown>
  value: ComputedRef<unknown>
  disabled: ComputedRef<boolean>
  componentProps: ComputedRef<Record<string, unknown>>
  t: (key: string, fallback?: string) => string
  setValue: (value: unknown) => void
  validate: () => void
}
成员含义
field应用 dependencies 覆盖后的当前字段 Schema
values表单当前的响应式值记录
value应用 defaultValuevalueFormat 后的字段值
disabled合并表单全局禁用与字段 disabled 后的状态
componentProps解析动态 props、placeholder 和选项国际化后的结果
t当前表单的国际化函数
setValue依次执行 parseValue、更新本地值、触发 change,并校验当前字段
validate使用当前字段 Schema 主动执行一次校验

具体选择和交互示例见 配置表单与字段

字段 adapter、Schema 绑定范围和字段联动的接入方式见 配置表单与字段