@ 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 — 附加在拖动手柄元素上 |
id | number | 实地标识 |
depth | number | 巢穴深度 (0 = 根级) |
index | number | 平面列表中的位置索引 |
parentId | number | null | 父区ID,或 null 根级 |
type | FieldType | 字段类型( O)'string', (中文(简体) ), 'number'页:1 |
item | AnyFieldContentItem | 定义中的完整字段内容项 。 这是 FieldContentItem | StaticFieldContentItem这样 item.label 实值 string | undefined 窄与 item.type === 'static' 要达到 item.text。 。 。 . |
isDragging | boolean | true 当此项目被拖动时 |
isSelected | boolean | true 当此项目的身份匹配时 selectedId |
onAdd | (item: NewContentItem) => number | 添加新项目到此字段的父部分; 返回新 ID |
onRemove | () => void | 删除此字段 |
onChange | (item: ContentItem) => void | 更新此字段 |
区域
形状与 FieldRenderProps 但:
| 财产 | 类型 | 说明 |
|---|---|---|
item | SectionContentItem | 定义中的完整部分内容项目 |
onAdd | (item: NewContentItem) => number | 添加新项目 内部 此区域; 返回新的ID |
onRemove | () => void | 删除此部分和所有后人 |
添加位置持有人选项
| 财产 | 类型 | 说明 |
|---|---|---|
depth | number | 占位符显示的嵌入深度 |
parentId | number | null | 父区ID,或 null 根级 |
onAdd | (item: NewContentItem) => number | 在此位置添加新项目; 返回新ID |
onChange | (id: number, item: ContentItem) => void | 通过 ID 更新已有项目 |
文档
| 文档 | 说明 |
|---|---|
| 建筑 | 项目结构、模块依赖性图表、拖放流动、树平整 |
| API 参考 | 完整的公用API——组件,钩子,类型,道具表 |
| 发展指南 | 如何建造、测试、涂抹和延长建造者 |