@formio/react

中文文档
6.2.2发布于 2026/10/10MITCommonJS近 30 天下载 13.3万

形式.io形式的反射渲染器.

中文使用文档
文档目录23 节
  1. 正式文件
  2. 安装
  3. 无
  4. 线条
  5. 使用 Vite( 注: 当使用像 Next.js 或 Create React App 这样的框架时, 不需要额外的 …
  6. 钩子
  7. 使用Formio Context
  8. 图片
  9. 构成部分
  10. 福尔米奥提供
  11. 表单
  12. 窗体构建器
  13. 窗体编辑
  14. 窗体图形
  15. 提交图像
  16. 模块
  17. 根号
  18. 认证
  19. 表单
  20. 表单
  21. 提交日期
  22. 提交的材料
  23. 许可证

@ formio/ 反应

用于根据 表格.io 平台.

正式文件

最新文件、发布资料和指南一律参考本文中提供的官方表格:

https://help.form.io (英语)

安装

无

npm install @formio/react --save
npm install @formio/js --save

线条

yarn add @formio/react @formio/js

使用 Vite( 注: 当使用像 Next.js 或 Create React App 这样的框架时, 不需要额外的 Vite 配置)

当使用 @formio/ resact 在 Vite 创建的工程中( 特别是针对 React 18 和 19) 时, 请确保您安装 @ vitejs/ plugin- react 软件包并在您的 vite 中配置 。 配置.js文件.

安装 Vite 反应插件

yarn add --dev @vitejs/plugin-react

在您的 vite.config.js 中,添加反应插件 :

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
});

钩子

使用Formio Context

向您的 React 组件提供全局Formio 上下文值的钩子 . 调用组件 useFormioContext 一定是一个孩子 <FormioProvider /> 组件.

返回值

useFormioContext 返回具有下列参数的对象:

名称类型说明
福尔米奥福尔米奥类型全球福尔米奥天体. 用于各种静态方法以及SDK函数,这些功能在 new 使用运算符.
基数Url字符串Form.io 服务器的基础 URL .
项目Url字符串Form.io企业项目的基础url.
登录() 无效一种方便方法,通过取消给定符并从本地存储中去掉来登录 Form.io会话.
符号字符串表格.io JWT-token(如果用户得到认证).
已认证布尔在Form.io会话中登录或退出时切换的便利值.

实例

使用由 useFormioContext 以评价用户的表单.io认证:

import { createRoot } from 'react-dom/client';
import { useFormioContext, FormGrid, FormioProvider } from '@formio/react';

const App = () => {
    const { isAuthenticated } = useFormioContext();

    return isAuthenticated ? (
        <Router>
            <Route path="/form">
                <FormGrid
                    formQuery={{ type: 'form' }}
                    onFormClick={(id) => setLocation(`/form/${id}`)}
                />
            </Route>
            <Route path="/resource">
                <FormGrid
                    formQuery={{ type: 'resource' }}
                    onFormClick={(id) => setLocation(`/resource/${id}`)}
                />
            </Route>
        </Router>
    ) : (
        <Redirect to="/login" />
    );
};

const domNode = document.getElementById('root');
const root = createRoot(domNode);
root.render(
    <FormioProvider projectUrl="https://examples.form.io">
        <App />
    </FormioProvider>,
);

使用 表格.io SDK 与 Form.io 服务器交互:

import { createRoot } from 'react-dom/client';
import { useEffect, useState } from 'react';
import {
    useFormioContext,
    FormioProvider,
    FormType,
    Form,
} from '@formio/react';

const FormsByUser = ({ userId }: { userId: string }) => {
    const { Formio, projectUrl } = useFormioContext();
    const [forms, setForms] = useState<FormType[]>([]);

    useEffect(() => {
        const fetchForms = async () => {
            const formio = new Formio(projectUrl);
            try {
                const forms = await formio.loadForms({
                    params: { type: 'form', owner: userId },
                });
                setForms(forms);
            } catch (err) {
                console.log(
                    `Error while loading forms for user ${userId}:`,
                    err,
                );
            }
        };
        fetchForms();
    }, [Formio, projectUrl, userId]);

    return forms.map(function (form) {
        return (
            <>
                <Form src={form} />
                <div style={{ marginBottom: '10px' }} />
            </>
        );
    });
};

const domNode = document.getElementById('root');
const root = createRoot(domNode);
const root = createRoot();
root.render(
    <FormioProvider projectUrl="https://examples.form.io">
        <App />
    </FormioProvider>,
);

图片

向您的 React 组件提供限制/ skip 服务器 pagination 数据和方法的钩头 . 调用组件 usePagination 一定是一个孩子 <FormioProvider /> 组件.

道具

名称类型说明
初始页编号要获取的初始页面 .
限制字符串每页结果数.
数据 OrFetch 函数T[] Q( 限制: 数量, 跳过: 数量) QQ 承诺<T[]>要拼接的完整数据集或返回数据的函数。 如果一个函数,则必须支持限制并跳过,成为稳定的引用.

返回值

usePagination 返回具有下列参数的对象:

名称类型说明
数据T[本页的数据.
共计数字 qq 未定义如果有,则列出文件总数.
页 次编号当前页码 .
拥有更多布尔表示服务器是否有更多结果的值 。 没有全部文档数时有用 .
下一页() 无效一个将数据移动到下一个可用页面的函数.
预选页() 无效一个将数据移动到上一个可用页面的函数.
获取页面(页:号码)一个将数据移动到指定页面的函数.

实例

贴出一组表格 :

import { createRoot } from 'react-dom/client';
import { useCallback } from 'react';
import {
    useFormioContext,
    FormioProvider,
    FormType,
    Form,
} from '@formio/react';

const FormsByUser = ({ userId }: { userId: string }) => {
    const { Formio, projectUrl } = useFormioContext();
    const fetchFunction = useCallback(
        (limit: number, skip: number) => {
            const formio = new Formio(`${projectUrl}/form`);
            return formio.loadForms({ params: { type: 'form', limit, skip } });
        },
        [Formio, projectUrl],
    );
    const { data, page, nextPage, prevPage, hasMore } = usePagination<FormType>(
        1,
        10,
        fetchFunction,
    );

    return (
        <div>
            <div>
                {data.map((form) => (
                    <>
                        <Form src={form} />
                        <div style={{ marginBottom: '10px' }} />
                    </>
                ))}
            </div>
            <ul>
                <li
                    onClick={prevPage}
                    className={`${page === 1 ? 'disabled' : ''}`}
                >
                    Prev
                </li>
                <li
                    onClick={nextPage}
                    className={`${hasMore ? '' : 'disabled'}`}
                >
                    Next
                </li>
            </ul>
        </div>
    );
};

const domNode = document.getElementById('root');
const root = createRoot(domNode);
const root = createRoot();
root.render(
    <FormioProvider projectUrl="https://examples.form.io">
        <App />
    </FormioProvider>,
);

构成部分

福尔米奥提供

使用此库中的一些钩和组件时需要的回放上下文提供者组件 .

道具

名称类型说明
福尔米奥对象要使用的 Formio 对象 .
基数Url字符串Form.io服务器的基础 URL.
项目Url字符串Form.io企业项目的url.

实例

从您自主机 Form.io 部署中生成一个简单的表格 :

import { createRoot } from 'react-dom/client';
import { Form, FormioProvider } from '@formio/react';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

root.render(
  <FormioProvider baseUrl="https://myformiodeployment.example.com/" projectUrl="https://myformiodeployment.example.com/myproject">
    <Form src="https://myformiodeployment.example.com/myproject/myexampleform" />
  </FormioProvider>
);

扩展Formio对象以使用外部模块 :

import { createRoot } from 'react-dom/client';
import { Form, FormioProvider } from '@formio/react';
import { Formio } from '@formio/js';
import premium from '@formio/premium';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

Formio.use(premium);
root.render(
  <FormioProvider Formio={Formio}>
    <Form src="https://myproject.form.io/myformwithpremiumcomponents" />
  </FormioProvider>
);

表单

反光组件包装 a 形式.io形式。可以使用 JSON 格式定义或 Form.io 格式 URL,并在您的 React 应用程序中制作格式.

道具

名称类型默认说明
srcWebform | stringJSON 格式定义或源 URL 。 如果一个 URL,通常来自 form.io 服务器.
urlstring形式定义的url. 与JSON表格定义一并使用 src,用于文件上传、OAuth以及需要了解Form.io表格的URL以便进一步处理的其他组件或动作。 表格将不会从此url中被载入, 提交文件也不会在此被保存 .
submissionJSON填表时提交数据。 您可以加载上一个提交件,也可以使用一些预填数据创建提交件。 如果不提交,表格将使用表格中的默认值初始化空提交.
optionsFormOptions表格选项。 见 这里 更多细节.
onFormReady(instance: Webform) => void调用函数, 当窗体已打开时被调用 。 用于访问基本的@formio/js Webform 实例 .
onSubmit(submission: JSON, saved?: boolean) => void当提交开始时调用回调函数 。 若为 src 这不是 Form.io 服务器 URL, 这将是最后提交事件 .
onCancelSubmit() => void当提交被取消时调用回调功能 .
onSubmitDone(submission: JSON) => void当提交文件成功提交到服务器时调用回调函数 。 只有在 src 设置为 Form.io 服务器 URL.
onChange(value: any, flags: any, modified: any) => void当提交文件中的值改变时,调用函数.
onComponentChange(changed: { instance: Webform; component: Component; value: any; flags: any}) => void当特定组件改变时,调用回调函数.
onError(error: EventError | false) => void在提交时发生错误(例如验证错误)时被调用的回调函数.
onRender(param: any) => void一个调用函数,当窗体完成渲染时被调用. param 将视窗体和显示类型而定.
onCustomEvent(event: { type: string; component: Component; data: JSON; event?: Event; }) => void从配置为"Event"类型的按钮组件所触发的回调函数.
onPrevPage(page: number, submission: JSON) => void向导表格的回调函数,在按下“上”按钮时被调用.
onNextPage(page: number, submission: JSON) => void向导格式的回调功能,在按下"Next"按钮时被调用.
otherEvents[event: string]: (...args: any[]) => void;用于签署其他活动的“全面捕捉”道具(完整列表见 我们的文件) (中文(简体) ).

实例

从表格.io SaaS中生成一个简单的形式:

import { createRoot } from 'react-dom/client';
import { Form } from '@formio/react';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

root.render(
    <Form src="https://example.form.io/example" onSubmit={console.log} />,
);

从 JSON 形式定义中生成一个简单的形式 :

import { createRoot } from 'react-dom/client';
import { Form } from '@formio/react';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

const formDefinition = {
    type: "form",
    display: "form",
    components: [
        {
            type: "textfield"
            key: "firstName",
            label: "First Name",
            input: true,
        },
        {
            type: "textfield"
            key: "firstName",
            label: "First Name",
            input: true,
        },
        {
            type: "button",
            key: "submit",
            label: "Submit",
            input: true
        }
    ]
}

root.render(<Form src={formDefinition} />);

访问基础形式实例(见 这里 详细情况:

import { useRef } from 'react';
import { createRoot } from 'react-dom/client';
import { Form } from '@formio/react';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

const formDefinition = {
    type: "form",
    display: "form",
    components: [
        {
            type: "textfield"
            key: "firstName",
            label: "First Name",
            input: true,
        },
        {
            type: "textfield"
            key: "firstName",
            label: "First Name",
            input: true,
        },
        {
            type: "button",
            key: "submit",
            label: "Submit",
            input: true
        }
    ]
}

const App = () => {
    const formInstance = useRef(null);

    const handleFormReady = (instance) => {
        formInstance.current = instance;
    }

    const handleClick = () => {
        if (!formInstance.current) {
            console.log("Our form isn't quite ready yet.");
            return;
        }
        formInstance.current.getComponent('firstName')?.setValue('John');
        formInstance.current.getComponent('lastName')?.setValue('Smith');
    }

    return (
        <div>
            <Form src={formDefinition} onFormReady={handleFormReady} />
            <button type="button" onClick={handleClick}>Set Names</button>
        </div>
    );
}

root.render(<App />);

下一个. js 的使用

A. 《公约》的一些依赖性 @formio/js 依赖 Web API 和浏览器专用全域像 window。因为 Next.js 包含服务器侧渲染阶段,所以即使用于 客户端组件因此,我们建议使用 Next.js 动态导入表单组件 dynamic API : (英语)

'use client';
import dynamic from 'next/dynamic';
import { Webform } from '@formio/js';

const Form = dynamic(
    () => import('@formio/react').then((module) => module.Form),
    { ssr: false },
);

export default function Home() {
    const formInstance = useRef<Webform | null>(null);

    const handleClick = () => {
        if (!formInstance.current) {
            console.log("Our form isn't quite ready yet.");
            return;
        }
        formInstance.current.getComponent('firstName')?.setValue('John');
        formInstance.current.getComponent('lastName')?.setValue('Smith');
    };

    return (
        <main className={styles.main}>
            <Form
                form="https://examples.form.io/example"
                onFormReady={(instance) => {
                    formInstance.current = instance;
                }}
            />
            <button onClick={handleClick}>Set Names</button>
        </main>
    );
}

窗体构建器

反光组件包装 a.io 窗体构建器。可以在您的 React 应用程序中创建窗体构建器.

道具

名称类型默认说明
initialFormFormTypeJSON形式定义了在构建器中要渲染的初始形式. 通常,这必须是一个稳定的参考;否则它可能会破坏并再现潜在的构建者实例并引起出人意料的行为.
optionsFormBuilderOptions窗体构建者选项 。 见 这里 更多细节.
onBuilderReady(instance: FormBuilder) => void在窗体构建器提供时被调用的回调函数 。 用于访问基本的 @formio/js FormBuilder 实例 .
onChange(form: FormType) => void当正在构建的窗体改变时, 调用函数会被调用 .
onSaveComponent(component: Component, original: Component, parent: Component, path: string, index: number, isNew: boolean, originalComponentSchema: Component) => void;一个调用函数,当组件被保存在构建器中时被调用.
onEditComponent(component: Component) => void一个当某个组件被编辑时被调用的回调函数 .
onUpdateComponent(component: Component) => void当组件更新时调用回调函数 .
onDeleteComponent(component: Component, parent: Component, path: string, index: number) => void当一个组件被删除时调用回调函数 .

实例

以空白形式绘制简单的窗体构建器 :

import { createRoot } from 'react-dom/client';
import { FormBuilder } from '@formio/react';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

root.render(
    <FormBuilder />,
);

绘制一个初始形式定义的构建者 :

import { createRoot } from 'react-dom/client';
import { FormBuilder } from '@formio/react';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

const formDefinition = {
    display: "form",
    components: [
        {
            type: "textfield"
            key: "firstName",
            label: "First Name",
            input: true,
        },
        {
            type: "textfield"
            key: "firstName",
            label: "First Name",
            input: true,
        },
        {
            type: "button",
            key: "submit",
            label: "Submit",
            input: true
        }
    ]
}

root.render(<FormBuilder form={formDefinition} />);

访问基础窗体构建器实例(参见 这里 详细情况:

import { useRef } from 'react';
import { createRoot } from 'react-dom/client';
import { FormBuilder } from '@formio/react';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

const formDefinition = {
    display: "form",
    components: [
        {
            type: "textfield"
            key: "firstName",
            label: "First Name",
            input: true,
        },
        {
            type: "textfield"
            key: "firstName",
            label: "First Name",
            input: true,
        },
        {
            type: "button",
            key: "submit",
            label: "Submit",
            input: true
        }
    ]
}

const App = () => {
    const formBuilderInstance = useRef(null);

    const handleFormReady = (instance) => {
        formBuilderInstance.current = instance;
    }

    const handleClick = () => {
        if (!formBuilderInstance.current) {
            console.log("Our form isn't quite ready yet.");
            return;
        }
        console.log("Here's our builder instance:", formBuilderInstance.current);
    }

    return (
        <div>
            <Form src={formDefinition} onFormReady={handleFormReady} />
            <button type="button" onClick={handleClick}>Log Our Builder</button>
        </div>
    );
}

root.render(<App />);

窗体编辑

FormEdit组件将FormBuilder组件包起来并添加了设置窗体,允许与Form.io服务器之间直接交互. 这个 FormEdit 组件必须是 <FormioProvider /> 组件.

道具

名称类型默认说明
initialFormFormType{ title: '', name: '', path: '', display: 'form' as const, type: 'form' as const, components: [] }要修改的现有形式的形式定义.
settingsFormFormTypeDEFAULT_SETTINGS_FORM"设置"表的形式定义,默认为定义正在编辑表的形式的标题,名称,路径,标记和显示.
settingsFormOptionsFormOptions{}选项传递到设置窗体 .
onSettingsFormReady(instance: Webform) => void这个 onFormReady 调用设置窗体 .
onBuilderReady(instance: FormioBuilder) => void这个 onBuilderReady 调用窗体构建器 .
builderOptionsFormBuilderOptions{}将选项传递给 FormBuilder .
saveFormFn(form: FormType) => Promise<CoreFormType>默认使用Form.io SDK将窗体保存到Form.io服务器 <FormioProvider />。 。 。 .
onSaveForm(form: FormType) => void后面的召回 saveFormFn 称为(道具或默认)。 一个可选功能,可以取代将窗体保存到 Form.io 服务器的默认行为.

样式

FormEdit 使用一个 components 包含每个“元素”的道具 FormEdit 组件,允许您输入自己的标记和样式。 这是它的类型:

type ComponentProp<T = object> = (props: T) => JSX.Element;
type Components = {
    Container?: ComponentProp<{ children: ReactNode }>;
    SettingsFormContainer?: ComponentProp<{ children: ReactNode }>;
    BuilderContainer?: ComponentProp<{ children: ReactNode }>;
    SaveButtonContainer?: ComponentProp<{ children: ReactNode }>;
    SaveButton?: ComponentProp<{
        onClick: () => void;
    }>;
};

实例

装入简单 FormEdit 从 Form.io 服务器上装入窗体的组件:

import { createRoot } from 'react-dom/client';
import { useState, useEffect } from 'react';
import {
    FormGrid,
    FormioProvider,
    useFormioContext,
    FormType,
} from '@formio/react';

const App = () => {
    const { Formio, projectUrl } = useFormioContext();
    const [form, setForm] = useState<FormType | undefined>();

    useEffect(() => {
        const fetchForm = async () => {
            try {
                const formio = new Formio(`${projectUrl}/example`);
                const form = await formio.loadForm();
                setForm(form);
            } catch (err) {
                console.log('Error while fetching form:', err);
            }
        };
    }, [Formio, projectUrl]);

    return form ? (
        <FormEdit
            initialForm={form}
            onSaveForm={() => console.log('Form saved to my Form.io server!')}
        />
    ) : null;
};
const domNode = document.getElementById('root');
const root = createRoot(domNode);

root.render(
    <FormioProvider projectUrl="https://examples.form.io">
        <App />
    </FormioProvider>,
);

将自己的标记和样式输入组件:

import { createRoot } from 'react-dom/client';
import { useState, useEffect } from 'react';
import {
    FormEdit,
    FormioProvider,
    useFormioContext,
    FormType,
} from '@formio/react';

const App = ({ name }: { name: string }) => {
    const { Formio, projectUrl } = useFormioContext();
    const [form, setForm] = useState<FormType | undefined>();

    useEffect(() => {
        const fetchForm = async () => {
            try {
                const formio = new Formio(`${projectUrl}/example`);
                const form = await formio.loadForm();
                setForm(form);
            } catch (err) {
                console.log('Error while fetching form:', err);
            }
        };
    }, [Formio, projectUrl]);

    return form ? (
        <FormEdit
            initialForm={form}
            onSaveForm={() => console.log('Form saved to my Form.io server!')}
            components={{
                SaveButtonContainer: ({ children }) => (
                    <div
                        className="save-form-bar button-wrap"
                        style={{ justifyContent: 'end' }}
                    >
                        {children}
                    </div>
                ),
                SaveButton: ({ onClick }) => (
                    <button className="button save-form" onClick={onClick}>
                        Save {name}
                    </button>
                ),
            }}
        />
    ) : null;
};
const domNode = document.getElementById('root');
const root = createRoot(domNode);

root.render(
    <FormioProvider projectUrl="https://examples.form.io">
        <App name="Form" />
    </FormioProvider>,
);

窗体图形

FormGrid组件可用于制作表格列表,每行都有一组动作. 这个 FormGrid 组件必须是 <FormioProvider /> 组件.

道具

名称类型默认说明
actionsAction[]DEFAULT_ACTIONS与每个窗体网格行上的按钮相对应的一系列动作。 默认为编辑动作( 将调用 onFormClick 函数道克)和一个删除动作(将使用Form.io SDK来软化删除窗体).
formsFormType[]如果你愿意自己去取, 你可以通过一系列的表格 FormGrid。 。 。 .
formQueryRecord<string, JSON>{}如果你不通过 forms 螺丝管, FormGrid 将使用 Form.io SDK 来获取基于 formQuery 道具 (英语).
onFormClick(id: string) => void调用函数 FormNameContainer .
limitnumber10使用的页面大小限制 usePagination。 。 。 .
componentsRecord<string, ComponentProp<T>>{}可样式组件列表 。 见 样式 详细情况.

样式

FormGrid 使用一个 components 包含每个“元素”的道具 FormGrid 组件,允许您输入自己的标记和样式。 这是它的类型:

type ComponentProp<T = object> = (props: T) => JSX.Element;
type Components = {
    Container?: ComponentProp<{ children: ReactNode }>;
    FormContainer?: ComponentProp<{ children: ReactNode }>;
    FormNameContainer?: ComponentProp<{
        children: ReactNode;
        onClick?: () => void;
    }>;
    FormActionsContainer?: ComponentProp<{ children: ReactNode }>;
    FormActionButton?: ComponentProp<{
        action: Action;
        onClick: () => void;
    }>;
    PaginationContainer?: ComponentProp<{ children: ReactNode }>;
    PaginationButton?: ComponentProp<{
        children: ReactNode;
        isActive?: boolean;
        disabled?: boolean;
        onClick: () => void;
    }>;
};

实例

装入从 Form.io 服务器获取窗体的简单窗体网格(通过 <FormioProvider /> 组件 :

import { createRoot } from 'react-dom/client';
import { FormGrid, FormioProvider } from '@formio/react';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

root.render(
    <FormioProvider projectUrl="https://examples.form.io">
        <FormGrid formQuery={{ type: 'form' }} />
    </FormioProvider>,
);

将自己的标记和样式输入组件:

import { FormGridProps, FormGrid } from '@formio/react';
import { createRoot } from 'react-dom/client';

const Container: FormGridComponentProps['Container'] = ({ children }) => (
    <div className="panel">{children}</div>
);

const FormContainer: FormGridComponentProps['FormContainer'] = ({
    children,
}) => (
    <div className={`item-wrap form`}>
        <button className="item">{children}</button>
    </div>
);

const FormNameContainer: FormGridComponentProps['FormNameContainer'] = ({
    children,
    onClick,
}) => {
    return (
        <div className="item-title" onClick={onClick}>
            <img src={`icon-form.svg`} alt={`${type} icon`} />
            {children}
        </div>
    );
};

const FormActionsContainer: FormGridComponentProps['FormActionsContainer'] = ({
    children,
}) => <div className="item-buttons">{children}</div>;

const FormActionButton: FormGridComponentProps['FormActionButton'] = ({
    action,
    onClick,
}) => (
    <a
        className={`btn ${action && action.name === 'Edit' ? 'edit' : 'trash'}`}
        onClick={onClick}
    >
        <i
            className={`${action && action.name === 'Edit' ? 'ri-edit-box-line' : 'ri-delete-bin-line'}`}
        ></i>{' '}
        {action && action.name === 'Edit' ? 'Edit' : ''}
    </a>
);

const PaginationContainer: FormGridComponentProps['PaginationContainer'] = ({
    children,
}) => <div className="pagination-buttons">{children}</div>;

const PaginationButton: FormGridComponentProps['PaginationButton'] = ({
    isActive,
    disabled,
    children,
    onClick,
}) => (
    <a
        className={`pagination-btn${isActive ? ' active' : ''}${disabled ? ' disabled' : ''}`}
        onClick={onClick}
    >
        {children}
    </a>
);

export const MyFormGrid = () => {
    return (
        <FormGrid
            formQuery={{ type: 'form' }}
            onFormClick={(id) => console.log(`Form with id ${id} clicked!`)}
            components={{
                Container,
                FormContainer,
                FormNameContainer,
                FormActionsContainer,
                FormActionButton,
                PaginationContainer,
                PaginationButton,
            }}
        />
    );
};

const domNode = document.getElementById('root');
const root = createRoot(domNode);

root.render(
    <FormioProvider projectUrl="https://examples.form.io">
        <MyFormGrid />
    </FormioProvider>,
);

提交图像

PresentGrid 组件可用于制作表格列表,每行都有一组动作. 这个 SubmissionGrid 组件必须是 <FormioProvider /> 组件.

道具

名称类型默认说明
submissionsSubmission[]如果你愿意自己去取, 你可以通过一系列提交到 SubmissionGrid。 。 。 .
formIdstring提交来文的表格编号 SubmissionGrid 如果 submissions 未提供道具.
submissionQueryRecord<string, JSON>{}如果你不通过 submissions 螺丝管, SubmissionsGrid 将使用 Form.io SDK 来获取基于 submissionQuery 道具 (英语).
onSubmissionClick(id: string) => void调用函数 TableBodyRowContainer 组件组件单击.
limitnumber10使用的页面大小限制 usePagination。 。 。 .
componentsRecord<string, ComponentProp<T>>{}可样式组件列表 。 见 样式 详细情况.

样式

SubmissionGrid 使用一个 components 包含每个成分“元素”的道具 SubmissionGrid 组件,允许您输入自己的标记和样式。 这是它的类型:

type ComponentProp<T = object> = (props: T) => JSX.Element;
type Components = {
    Container?: ComponentProp<{ children: ReactNode }>;
    TableContainer?: ComponentProp<{ children: ReactNode }>;
    TableHeadContainer?: ComponentProp<{ children: ReactNode }>;
    TableHeadCell?: ComponentProp<{ children: ReactNode }>;
    TableBodyRowContainer?: ComponentProp<{
        children: ReactNode;
        onClick?: () => void;
    }>;
    TableHeaderRowContainer?: ComponentProp<{ children: ReactNode }>;
    TableBodyContainer?: ComponentProp<{ children: ReactNode }>;
    TableCell?: ComponentProp<{ children: ReactNode }>;
    PaginationContainer?: ComponentProp<{ children: ReactNode }>;
    PaginationButton?: ComponentProp<{
        children: ReactNode;
        isActive?: boolean;
        disabled?: boolean;
        onClick: () => void;
    }>;
};

实例

装入从 Form.io 服务器获取窗体的简单提交网格(通过 <FormioProvider /> 组件 :

import { createRoot } from 'react-dom/client';
import { SubmissionGrid, FormioProvider } from '@formio/react';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

root.render(
    <FormioProvider projectUrl="https://examples.form.io">
        <SubmissionGrid formId="57aa1d2a5b7a477b002717fe" />
    </FormioProvider>,
);

将自己的标记和样式输入组件:

import { SubmissionGridProps, SubmissionGrid } from '@formio/react';
import { createRoot } from 'react-dom/client';

const components: SubmissionTableProps['components'] = {
    Container: ({ children }) => <div className="table-wrap">{children}</div>,
    TableContainer: ({ children }) => (
        <div className="table remember-focus-table">{children}</div>
    ),
    TableHeadContainer: ({ children }) => <div>{children}</div>,
    TableHeaderRowContainer: ({ children }) => (
        <div className="trow heading">{children}</div>
    ),
    TableHeadCell: ({ children }) => <div className="tcol">{children}</div>,
    TableBodyRowContainer: ({ children, onClick }) => (
        <div className="trow entry" onClick={onClick}>
            {children}
        </div>
    ),
    TableBodyContainer: ({ children }) => <div>{children}</div>,
    TableCell: ({ children }) => <div className="tcol">{children}</div>,
    PaginationContainer: ({ children }) => (
        <div className="table-pagination">
            <div className="table-pagination-controls">{children}</div>
        </div>
    ),
    PaginationButton: ({ children, isActive, onClick, disabled }) => (
        <a
            className={`pagination-btn${isActive ? ' active' : ''}${disabled ? ' disabled' : ''}`}
            onClick={onClick}
        >
            {children}
        </a>
    ),
};

export const MySubmissionGrid = ({ id }: { id: string }) => {
    return (
        <SubmissionGrid
            onSubmissionClick={(id) =>
                console.log(`Submission with id ${id} clicked!`)
            }
            components={components}
            formId={id}
        />
    );
};

const domNode = document.getElementById('root');
const root = createRoot(domNode);

root.render(
    <FormioProvider projectUrl="https://examples.form.io">
        <MySubmissionGrid id="57aa1d2a5b7a477b002717fe" />
    </FormioProvider>,
);

模块

模块包含Redux动作,还原器,常数和选择器来简化对形式.io表单的API请求. 减少器、动作和选择器都有名字。 这提供了命名空间,所以相同的动作和还原器可以在同一redux状态内被再用.

根号

根模块是其他模块,如所选的Root选择器共享的事物的容器.

选择器

名称参数说明
selectRoot名称:字符串,状态:对象返回命名空间的状态.
selectError名称:字符串,状态:对象返回命名空间的任何错误.
selectIsActive名称:字符串,状态:对象返回为命名空间的有效状态.

认证

认证模块旨在方便用户在反应内使用表单.io登录系统进行登录,注册和认证.

递减器

名称参数说明
auth配置:对象将用户和访问信息挂载到状态树上。 配置目前没有使用,而是一个占位符,使其与其他还原符一致.

行动

名称参数说明
initAuth这通常在应用程序代码的开头使用. 它将检查本地Storage是否有一个用户代号,如果找到,请登录,并获取用户所需的信息.
setUser用户:对象当用户登录时, 这将设置用户并获取该用户的访问信息 。 用户对象通常是来自登录或注册表的提交.
logout此动作会将全部重置到默认状态,包括去除任何本地Storage信息.

表单

形式模块用于与单一形式互动.

递减器

名称参数说明
form配置:对象将形式挂到州树上. 配置对象应当包含一个名称属性,为redux状态定义一个独有的名称.

行动

名称参数说明
getForm名称:字符串, id: 字符串, 已完成: 函数从服务器获取表单 。 如果没有提供ID,则使用名称作为路径. 这个 done 动作完成后将调用回调 。 第一个参数是任意错误,第二个是形式定义.
saveForm名称:字符串,形式:对象,完成:函数向服务器保存窗体 。 它会使用表格上的 id 属性来保存, 如果它存在的话 。 否则,它将创造出一种新的形式。 这个 done 动作完成后将调用回调 。 第一个参数是任意错误,第二个是形式定义.
deleteForm名称:字符串, id: 字符串, 已完成: 函数用 ID 删除服务器上的窗体 .
resetForm将这个还原器重置回初始状态 。 这在删除后自动调用, 但也可以调用其他时间 .

选择器

名称参数说明
selectForm名称:字符串,状态:对象从状态中选择窗体定义.

表单

形式模块处理多种形式,如形式列表.

递减器

名称参数说明
forms配置:对象把表格挂到州树上 配置对象应当包含一个名称属性,为redux状态定义一个独有的名称. 配置对象也可以包含一个查询属性,该属性被添加到所有表格请求中. 例如: {tags:'common'} 将表格列表限制在只标有"common"的表格 .

行动

名称参数说明
getForms名称:字符串,页面:整数,参数:对象从服务器获取表格列表 . params 是过滤窗体的查询对象.
resetForms将这个还原器重置回初始状态 。 这在删除后自动调用, 但也可以调用其他时间 .

选择器

名称参数说明
selectForms名称:字符串,状态:对象从状态中选择表格列表.

提交日期

提交模块用于与单一提交书互动.

递减器

名称参数说明
submission配置:对象将呈文挂入州树. 配置对象应当包含一个名称属性,为redux状态定义一个独有的名称.

行动

名称参数说明
getSubmission名称:字符串, id: 字符串, 窗体Id: 字符串, 已完成: 函数从服务器获取提交文件 。 这个 done 动作完成后将调用回调 。 第一个参数是任何错误,第二个参数是提交.
saveSubmission名称:字符串,提交:对象,窗体Id:字符串,完成:函数保存提交到服务器 。 它会使用提交文件中的 id 属性来保存,如果它存在的话 。 否则,它将产生新的呈文。 这个 done 动作完成后将调用回调 。 第一个参数是任何错误,第二个参数是提交.
deleteSubmission名称:字符串, id: 字符串, 窗体Id: 字符串, 已完成: 函数用 ID 删除服务器上的提交 .
resetSubmission将这个还原器重置回初始状态 。 这在删除后自动调用, 但也可以调用其他时间 .

选择器

名称参数说明
selectSubmission名称:字符串,状态:对象从状态中选择提交数据.

提交的材料

提交书模块处理多种提交书的形式,如提交书清单.

递减器

名称参数说明
submissions配置:对象将提交文件上载到状态树上。 配置对象应当包含一个名称属性,为redux状态定义一个独有的名称.

行动

名称参数说明
getSubmissions名称:字符串,页面:整数,参数:对象,窗体Id:字符串从服务器获取提交列表 . params 是过滤提交文件的查询对象.
resetSubmissions将这个还原器重置回初始状态 。 这在删除后自动调用, 但也可以调用其他时间 .

选择器

名称参数说明
selectSubmissions名称:字符串,状态:对象选择来自状态的提交列表 .

许可证

释放 MIT 许可证。 。 。 .

版本与发布记录

@formio/react 共发布 79 个版本,首次发布于 2020/06/13;过去 12 个月发布了 8 个版本。

版本发布日期距今
6.2.2latest2026/10/101 个月前
6.2.12026/06/045 个月前
6.2.1-api98.02026/03/098 个月前
6.2.1-refb-rc.12026/02/079 个月前
6.2.1-refb-rc.02026/02/069 个月前
6.2.02026/01/309 个月前

其他发布通道:5_x → 5.0.0-m.8,7_0_x → 7.0.0-rc.1,rc → 7.0.0-rc.2,6_0_x → 6.0.2,dev → 7.0.0-dev.623.c1e476b,6_1_x → 6.1.2-rc.0。

关于 @formio/react 的常见问题

@formio/react 是什么?

形式.io形式的反射渲染器.

如何安装 @formio/react?

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

@formio/react 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/formio__react 是否存在。

@formio/react 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@formio/react 可以商用吗?

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

@formio/react 的下载量有多少?

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

@formio/react 还在维护吗?

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