优化FormItemsRenderer

master
LiuJiaNan 2025-10-28 12:30:57 +08:00
parent c549a07503
commit 215c482b38
4 changed files with 30 additions and 21 deletions

View File

@ -44,6 +44,7 @@ const FormBuilder = (props) => {
<Row gutter={gutter}> <Row gutter={gutter}>
<FormItemsRenderer <FormItemsRenderer
options={options} options={options}
labelCol={labelCol}
span={span} span={span}
useAutoGenerateRequired={useAutoGenerateRequired} useAutoGenerateRequired={useAutoGenerateRequired}
/> />

View File

@ -59,7 +59,7 @@ export interface FormOption {
tip?: ReactNode; tip?: ReactNode;
/** 是否隐藏,默认 false支持函数动态计算 */ /** 是否隐藏,默认 false支持函数动态计算 */
hidden?: boolean | ((formValues: FormValues) => boolean); hidden?: boolean | ((formValues: FormValues) => boolean);
/** 是否自定义渲染,默认 false将不生成 Col 和 Form.Item 仅生效 render、items、itemsField、componentProps */ /** 是否自定义渲染,默认 false将不生成 Form.Item */
customizeRender?: boolean; customizeRender?: boolean;
/** 选项数据(用于 select、radio、checkbox */ /** 选项数据(用于 select、radio、checkbox */
items?: OptionItem[]; items?: OptionItem[];
@ -69,9 +69,9 @@ export interface FormOption {
componentProps?: Record<string, any> | ((formValues: FormValues) => Record<string, any>); componentProps?: Record<string, any> | ((formValues: FormValues) => Record<string, any>);
/** 传递给 Form.Item 的属性,支持函数动态计算 */ /** 传递给 Form.Item 的属性,支持函数动态计算 */
formItemProps?: FormItemProps | ((formValues: FormValues) => FormItemProps); formItemProps?: FormItemProps | ((formValues: FormValues) => FormItemProps);
/** label 栅格配置 */ /** label 栅格配置,默认直接使用外层的 labelCol如果 span 等于 24是外层的 labelCol.span 一半 */
labelCol?: ColProps; labelCol?: ColProps;
/** wrapper 栅格配置 */ /** wrapper 栅格配置,默认为 24 - labelCol.span */
wrapperCol?: ColProps; wrapperCol?: ColProps;
/** 是否应该更新(用于表单联动) */ /** 是否应该更新(用于表单联动) */
shouldUpdate?: boolean | ((prevValues: FormValues, nextValues: FormValues, info: { source?: string }) => boolean); shouldUpdate?: boolean | ((prevValues: FormValues, nextValues: FormValues, info: { source?: string }) => boolean);

View File

@ -22,6 +22,7 @@ const { RangePicker } = DatePicker;
*/ */
const FormItemsRenderer = ({ const FormItemsRenderer = ({
options, options,
labelCol,
span = 12, span = 12,
collapse = false, collapse = false,
useAutoGenerateRequired = true, useAutoGenerateRequired = true,
@ -260,7 +261,11 @@ const FormItemsRenderer = ({
return ( return (
<> <>
{options.map((option, index) => { {options.map((option, index) => {
// 列数
const itemSpan = option.render === FORM_ITEM_RENDER_ENUM.DIVIDER ? 24 : option.span ?? span; const itemSpan = option.render === FORM_ITEM_RENDER_ENUM.DIVIDER ? 24 : option.span ?? span;
const itemLabelCol = option.labelCol ? option.labelCol : (itemSpan === 24 ? { span: labelCol.span / 2 } : labelCol);
const itemWrapperCol = option.wrapperCol ? option.wrapperCol : { span: 24 - itemLabelCol.span };
// 使用 style 控制显示/隐藏 // 使用 style 控制显示/隐藏
const style = collapse && index >= 3 ? { display: "none" } : undefined; const style = collapse && index >= 3 ? { display: "none" } : undefined;
@ -299,8 +304,8 @@ const FormItemsRenderer = ({
name={option.name} name={option.name}
label={renderLabel(option)} label={renderLabel(option)}
rules={getRules(option)} rules={getRules(option)}
labelCol={option.labelCol} labelCol={itemLabelCol}
wrapperCol={option.wrapperCol} wrapperCol={itemWrapperCol}
{...getFormItemProps(option)} {...getFormItemProps(option)}
> >
{renderFormControl(option)} {renderFormControl(option)}
@ -318,22 +323,24 @@ const FormItemsRenderer = ({
return null; return null;
return ( return (
option.customizeRender <Col key={option.name || index} span={itemSpan} style={style}>
? (renderFormControl(option)) {
: ( option.customizeRender
<Col key={option.name || index} span={itemSpan} style={style}> ? (renderFormControl(option))
<Form.Item : (
name={option.name} <Form.Item
label={renderLabel(option)} name={option.name}
rules={getRules(option)} label={renderLabel(option)}
labelCol={option.labelCol} rules={getRules(option)}
wrapperCol={option.wrapperCol} labelCol={itemLabelCol}
{...getFormItemProps(option)} wrapperCol={itemWrapperCol}
> {...getFormItemProps(option)}
{renderFormControl(option)} >
</Form.Item> {renderFormControl(option)}
</Col> </Form.Item>
) )
}
</Col>
); );
})} })}
</> </>

View File

@ -80,6 +80,7 @@ const Search = (props) => {
<Row className={classNameRef.current}> <Row className={classNameRef.current}>
<FormItemsRenderer <FormItemsRenderer
options={options} options={options}
labelCol={labelCol}
span={6} span={6}
collapse={collapse} collapse={collapse}
useAutoGenerateRequired={false} useAutoGenerateRequired={false}