@bluprynt/forms-builder

中文文档
4.2.0发布于 2026/10/21TypeScriptESM + CJS零依赖近 30 天下载 2.1万

用于构建和编辑的无头反应组件, 构成带有拖放重排的策略 。 与 @bluprynt/forms-core 以通过 FormDefinitionEditor。 。 。 .

中文使用文档
文档目录9 节
  1. 密钥能力
  2. 安装
  3. 快速启动
  4. 处理选择
  5. 渲染组件道具
  6. 外地渲染方案
  7. 区域
  8. 添加位置持有人选项
  9. 文档

@ bluprynt/ forms- buildinger (帮助) @ info: whatsthis

用于构建和编辑的无头反应组件, 构成带有拖放重排的策略 。 与 @bluprynt/forms-core 以通过 FormDefinitionEditor。 。 。 .

密钥能力

  • 拖放重排顺序 ——通过@dnd-kit来重排有深度意识的筑巢场和区段,并尊重3级最大筑巢深度.
  • 斯克马 CRUD ——添加,更新并去除字段和段落. 所有突变都经过 FormDefinitionEditor 从 @bluprynt/forms-core。 。 。 .
  • 无头建筑 ——所有渲染都委托给您提供的组件(container, (中文(简体) ), section, (中文(简体) ), field, (中文(简体) ), addPlaceholder),因此软件包的UI观点为零.
  • 深度意识入巢 ——水平拖放相抵控制入巢深度. 只有科可以接受被窝中的孩子,在拖放投影时执行.
  • 添加占位符 ——每节末尾和根级自动插入点来添加新项目.

安装

npm install @bluprynt/forms-builder @bluprynt/forms-core ajv react react-dom @dnd-kit/abstract @dnd-kit/dom @dnd-kit/helpers @dnd-kit/react @dnd-kit/state

@bluprynt/forms-core, (中文(简体) ), react, (中文(简体) ), react-dom,以及 @dnd-kit/* 软件包是同伴的依赖性,必须安装在您的工程中.

快速启动

import { useState, type FC } from 'react'
import { FormBuilder } from '@bluprynt/forms-builder'
import type {
  FieldRenderProps,
  SectionRenderProps,
  AddPlaceholderRenderProps,
  NewContentItem,
} from '@bluprynt/forms-builder'
import type { FormDefinition } from '@bluprynt/forms-core'

const MyField: FC<FieldRenderProps> = ({ ref, handleRef, item, isDragging, onRemove }) => (
  <div ref={ref} style={{ opacity: isDragging ? 0.5 : 1 }}>
    <span ref={handleRef}>⠿</span>
    {item.label}
    <button onClick={onRemove}>Remove</button>
  </div>
)

const MySection: FC<SectionRenderProps> = ({ ref, handleRef, item, isDragging }) => (
  <div ref={ref} style={{ opacity: isDragging ? 0.5 : 1 }}>
    <span ref={handleRef}>⠿</span>
    {item.title}
  </div>
)

const MyAddPlaceholder: FC<AddPlaceholderRenderProps> = ({ onAdd }) => (
  <button onClick={() => onAdd({ type: 'string', label: 'New Field' })}>
    + Add Field
  </button>
)

const Builder: FC = () => {
  const [definition, setDefinition] = useState<FormDefinition>(initialDefinition)

  return (
    <FormBuilder
      definition={definition}
      container={({ children }) => <div>{children}</div>}
      section={MySection}
      field={MyField}
      addPlaceholder={MyAddPlaceholder}
      selectedId={null}
      onDefinitionChange={setDefinition}
    />
  )
}

处理选择

跟踪通过选择的项目 selectedId。每个外地和科部分都收到 isSelected数字 :

const [selectedId, setSelectedId] = useState<number | null>(null)

<FormBuilder
  definition={definition}
  container={({ children }) => <div>{children}</div>}
  section={(props) => (
    <div ref={props.ref} onClick={() => setSelectedId(props.id)}
      style={{ outline: props.isSelected ? '2px solid blue' : 'none' }}>
      <span ref={props.handleRef}>⠿</span>
      {props.item.title}
    </div>
  )}
  field={(props) => (
    <div ref={props.ref} onClick={() => setSelectedId(props.id)}
      style={{ outline: props.isSelected ? '2px solid blue' : 'none' }}>
      <span ref={props.handleRef}>⠿</span>
      {props.item.label}
    </div>
  )}
  addPlaceholder={MyAddPlaceholder}
  selectedId={selectedId}
  onDefinitionChange={setDefinition}
/>

渲染组件道具

外地渲染方案

财产类型说明
ref(element: Element | null) => void可排序项目参考文件——附于最外的 DOM 元素
handleRef(element: Element | null) => void拖动手柄 ref — 附加在拖动手柄元素上
idnumber实地标识
depthnumber巢穴深度 (0 = 根级)
indexnumber平面列表中的位置索引
parentIdnumber | null父区ID,或 null 根级
typeFieldType字段类型( O)'string', (中文(简体) ), 'number'页:1
itemAnyFieldContentItem定义中的完整字段内容项 。 这是 FieldContentItem | StaticFieldContentItem这样 item.label 实值 string | undefined 窄与 item.type === 'static' 要达到 item.text。 。 。 .
isDraggingbooleantrue 当此项目被拖动时
isSelectedbooleantrue 当此项目的身份匹配时 selectedId
onAdd(item: NewContentItem) => number添加新项目到此字段的父部分; 返回新 ID
onRemove() => void删除此字段
onChange(item: ContentItem) => void更新此字段

区域

形状与 FieldRenderProps 但:

财产类型说明
itemSectionContentItem定义中的完整部分内容项目
onAdd(item: NewContentItem) => number添加新项目 内部 此区域; 返回新的ID
onRemove() => void删除此部分和所有后人

添加位置持有人选项

财产类型说明
depthnumber占位符显示的嵌入深度
parentIdnumber | null父区ID,或 null 根级
onAdd(item: NewContentItem) => number在此位置添加新项目; 返回新ID
onChange(id: number, item: ContentItem) => void通过 ID 更新已有项目

文档

文档说明
建筑项目结构、模块依赖性图表、拖放流动、树平整
API 参考完整的公用API——组件,钩子,类型,道具表
发展指南如何建造、测试、涂抹和延长建造者

版本与发布记录

@bluprynt/forms-builder 共发布 6 个版本,首次发布于 2026/03/20;过去 12 个月发布了 6 个版本。

版本发布日期距今
4.2.0latest2026/10/2117 天前
4.1.02026/09/221 个月前
4.0.12026/06/294 个月前
3.0.02026/03/247 个月前
2.0.02026/03/247 个月前
1.0.02026/03/207 个月前

关于 @bluprynt/forms-builder 的常见问题

@bluprynt/forms-builder 是什么?

用于构建和编辑的无头反应组件, 构成带有拖放重排的策略 。 与 @bluprynt/forms-core 以通过 FormDefinitionEditor。 。 。 .

如何安装 @bluprynt/forms-builder?

在项目目录运行 npm install @bluprynt/forms-builder,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^18.0.0 || ^19.0.0)、react-dom(^18.0.0 || ^19.0.0)、@dnd-kit/dom(^0.5.0)、@dnd-kit/react(^0.5.0)、@dnd-kit/state(^0.5.0)、@dnd-kit/helpers(^0.5.0)、@dnd-kit/abstract(^0.5.0)、@bluprynt/forms-core(^4.2.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@bluprynt/forms-builder 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@bluprynt/forms-builder 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@bluprynt/forms-builder 可以商用吗?

@bluprynt/forms-builder 使用 未声明 许可。package.json 没有声明许可证。没有许可证的代码默认保留全部权利,商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括,不构成法律意见,请以许可原文为准。

@bluprynt/forms-builder 的下载量有多少?

根据 npm 官方下载统计,@bluprynt/forms-builder 在 2026/10/09 – 2026/11/07 这 30 天内被下载 20,678 次,日均约 689 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bluprynt/forms-builder 还在维护吗?

最新版本 4.2.0 发布于 2026/10/21(17 天前);至今共发布 6 个版本,其中过去 12 个月发布了 6 个;首次发布于 2026/03/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。