不,没有办法将rjsf
表单拆分为多个 UI 组件。您可以通过制作多个表单(多个 JSON Schema )来模拟该行为schema
。根据您想要的组合输出的结构,schema
通过根级别明显的不同嵌套属性来分解可能是最简单的,例如,第一页对应于根级别的第一个键 ( name
),第二页对应于第二个键 ( age
),依此类推。请注意,您必须自己控制此分页和导航,并将每个页面的formData
后部合并到您期望的单个有效负载中。
这是一个粗略的草稿:
pageOneSchema = {
title: "Test form pg. 1",
type: "object",
properties: {
name: {
type: "string"
}
}
};
pageTwoSchema = {
title: "Test form pg. 2",
type: "object",
properties: {
age: {
type: "number"
}
}
};
const schemas = [pageOneSchema, pageTwoSchema];
// Your component's member functions to orchestrate the form and its "pages"
state = {
currentPage: 0,
pages: new Array(schemas.length).fill({}), // initial pages array to empty objects = unfilled forms
}
pageDataChangeHandler = (page) => {
const onChange = (e) => {
const pages = [...this.state.pages];
pages[page] = e.formData; // not too 100% about the key
this.setState({
pages,
});
}
}
getSubmitHandlerForPage = (page) => {
if (page !== schemas.length) {
// If current page is not the last page, move to next page
this.setState({
currentPage: page + 1,
});
} else {
// concat all the pages' data together to recompose the singular payload
}
}
...
const { currentPage } = this.state;
<Form
formData={this.state.pages[currentPage]}
schema={schemas[currentPage]}
onChange={this.pageDataChangeHandler(currentPage)}
onSubmit={this.getSubmitHandlerForPage(currentPage)}
/>
您还可以将子项传递到 Form 组件以呈现您自己的按钮(因此,如果表单实际上不提交,您可能不希望表单显示“提交”而不是“下一页”)。
请注意,如果您执行自定义按钮并制作“下一步”按钮,由于它发出的事件类型(用于验证和其他一些事情),它仍然必须是“提交”类型。尽管有人要求使提交按钮的文本/标题更易于操作...