@buildnbuzz/form-react

中文文档
0.1.13发布于 2026/06/10MITTypeScriptESM + CJS构建来源已验证近 30 天下载 3288

React primitives for BuzzForm.

原始使用文档
文档目录14 节
  1. Installation
  2. Quick Start
  3. Core APIs
  4. useForm Hook
  5. <FormProvider>
  6. <FieldRenderer> / <RenderFields>
  7. Building Custom Field Components
  8. Data Fields
  9. Layout Fields
  10. useDataField Return Type
  11. Field Registry
  12. Validation
  13. Additional Hooks
  14. Resources

@buildnbuzz/form-react

React primitives for BuzzForm. Headless components powered by TanStack Form.

Installation

pnpm add @buildnbuzz/form-react

Peer dependencies: @buildnbuzz/form-core, @tanstack/react-form, @tanstack/form-core, react

Quick Start

"use client";

import { defineSchema, type InferType } from "@buildnbuzz/form-core";
import { useForm, FieldRenderer } from "@buildnbuzz/form-react";
import { shadcnRegistry } from "@/registry/shadcn/fields";

const schema = defineSchema({
  title: "Contact Form",
  fields: [
    { type: "text", name: "name", label: "Name", required: true },
    { type: "email", name: "email", label: "Email", required: true },
  ],
});

export function ContactForm() {
  const form = useForm({
    schema,
    onSubmit: ({ value }) => {
      console.log(value);
    },
  });

  return (
    <form onSubmit={form.handleSubmit}>
      <FieldRenderer
        field={schema.fields[0]!}
        form={form}
        registry={shadcnRegistry}
      />
      <FieldRenderer
        field={schema.fields[1]!}
        form={form}
        registry={shadcnRegistry}
      />
      <button type="submit">Submit</button>
    </form>
  );
}

Core APIs

useForm Hook

Extends TanStack Form's useForm with schema defaults, validation, and output transforms:

import { useForm } from "@buildnbuzz/form-react";

const form = useForm({
  schema,
  defaultValues: { name: "Default" }, // Merges with schema defaults
  contextData: { userRole: "admin" }, // For $context references
  customValidators: {
    /* ... */
  },
  output: { type: "path" }, // Flatten nested output
  onSubmit: ({ value }) => {
    // value is transformed if output config is set
  },
});

<FormProvider>

Set up field registry globally:

import { FormProvider } from "@buildnbuzz/form-react";
import { shadcnRegistry } from "@/registry/shadcn/fields";

<FormProvider registry={shadcnRegistry}>
  <App />
</FormProvider>;

<FieldRenderer> / <RenderFields>

Render schema fields with a registry:

import { FieldRenderer, RenderFields } from "@buildnbuzz/form-react";

// Single field
<FieldRenderer field={schema.fields[0]!} form={form} />

// All fields
<RenderFields fields={schema.fields} form={form} />

Building Custom Field Components

Data Fields

Use useDataField for fields that register with TanStack Form:

import { useDataField } from "@buildnbuzz/form-react";
import type { TextField as TextFieldDef } from "@buildnbuzz/form-core";

export function TextField() {
  const {
    fieldApi,
    field,
    label,
    description,
    errors,
    isInvalid,
    isDisabled,
    isReadOnly,
    isRequired,
    descriptionId,
    errorId,
    ariaDescribedBy,
    handleChange,
    handleBlur,
  } = useDataField<TextFieldDef>();

  return (
    <div>
      <label htmlFor={fieldApi.name}>
        {label}
        {isRequired && <span>*</span>}
      </label>
      <input
        id={fieldApi.name}
        value={fieldApi.state.value ?? ""}
        onChange={(e) => handleChange(e.target.value)}
        onBlur={handleBlur}
        disabled={isDisabled}
        readOnly={isReadOnly}
        aria-invalid={isInvalid}
        aria-describedby={ariaDescribedBy}
      />
      {description && <p>{description}</p>}
      {isInvalid && <p role="alert">{errors.join(", ")}</p>}
    </div>
  );
}

Layout Fields

Use useLayoutField for container fields (row, tabs, collapsible):

import { useLayoutField } from "@buildnbuzz/form-react";
import type { RowField as RowFieldDef } from "@buildnbuzz/form-core";

export function RowField({ children }: { children?: React.ReactNode }) {
  const { label, description } = useLayoutField<RowFieldDef>();

  return (
    <div className="flex gap-4">
      {label && <label>{label}</label>}
      {description && <p>{description}</p>}
      {children}
    </div>
  );
}

useDataField Return Type

PropertyDescription
fieldApiTanStack field instance
fieldCore field schema
formForm instance
label, placeholder, descriptionResolved text (supports dynamic values)
isDisabled, isReadOnly, isRequired, isHiddenRuntime visibility state
errors, isInvalid, errorId, descriptionId, ariaDescribedByError + a11y state
handleChange, handleBlurPreferred handlers (auto-trim, transforms)

Field Registry

Map field types to React components:

import type { FieldRegistry } from "@buildnbuzz/form-react";

const registry: FieldRegistry = {
  text: TextField,
  email: EmailField,
  select: SelectField,
  group: GroupField,
  array: ArrayField,
  row: RowField,
  tabs: TabsField,
  // ...
};

Components receive children for nested fields (groups, arrays, rows, tabs):

export function GroupField({ children }: { children?: React.ReactNode }) {
  const { label, field } = useDataField();

  return (
    <fieldset>
      <legend>{label}</legend>
      {children}
    </fieldset>
  );
}

Validation

Auto-derived from schema + custom validators:

const form = useForm({
  schema,
  customValidators: {
    usernameAvailable: async (value) => {
      const available = await checkUsername(value as string);
      return available ? undefined : "Username taken";
    },
  },
  derivedValidationMode: "blur", // When to run auto-derived checks
});

Additional Hooks

import {
  useFormContext, // Get form instance
  useFieldApi, // Get TanStack field API
  useRegistry, // Get field registry
  useFieldOptions, // Normalize select/radio options
  useNestedErrorCount, // Count errors in child fields
} from "@buildnbuzz/form-react";

Resources

版本与发布记录

@buildnbuzz/form-react 共发布 14 个版本,首次发布于 2026/03/31;过去 12 个月发布了 14 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.13latest2026/06/104 个月前
0.1.122026/06/035 个月前
0.1.112026/05/195 个月前
0.1.102026/05/165 个月前
0.1.92026/05/115 个月前
0.1.82026/04/196 个月前

关于 @buildnbuzz/form-react 的常见问题

@buildnbuzz/form-react 是什么?

React primitives for BuzzForm.

如何安装 @buildnbuzz/form-react?

在项目目录运行 npm install @buildnbuzz/form-react,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^18 || ^19)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@buildnbuzz/form-react 支持 TypeScript 吗?

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

@buildnbuzz/form-react 支持 ESM 还是 CommonJS?

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

@buildnbuzz/form-react 可以商用吗?

@buildnbuzz/form-react 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@buildnbuzz/form-react 的下载量有多少?

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

@buildnbuzz/form-react 还在维护吗?

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