diff --git a/src/components/FormBuilder/FormItemsRenderer.js b/src/components/FormBuilder/FormItemsRenderer.js index c7b0f64..2740a77 100644 --- a/src/components/FormBuilder/FormItemsRenderer.js +++ b/src/components/FormBuilder/FormItemsRenderer.js @@ -506,10 +506,11 @@ const FormItemsRenderer = ({ return ( {listOptions.map((listOption, listIndex) => { + if (getHidden(listOption.hidden)) + return null; + const col = getCol(listOption); const formItemProps = getFormItemProps(listOption); - delete formItemProps.dependencies; - delete formItemProps.shouldUpdate; const params = { option: listOption, @@ -524,12 +525,33 @@ const FormItemsRenderer = ({ if (listOption.render === FORM_ITEM_RENDER_ENUM.FORM_LIST) return renderFormList(params); - // 判断下一个是否是嵌套的 FormList,如果是则在当前项后添加按钮 + // 判断一个项是否需要显示按钮(不是 onlyForLabel 且不是隐藏的) + const isShowButton = (opt) => { + return !getHidden(opt.hidden) && !opt.onlyForLabel; + }; + + // 从后往前找,找到第一个需要显示按钮的项的索引 + const findLastButtonIndex = () => { + for (let i = listOptions.length - 1; i >= 0; i--) { + const opt = listOptions[i]; + if (opt.render === FORM_ITEM_RENDER_ENUM.FORM_LIST) + return i; + if (isShowButton(opt)) + return i; + } + return -1; + }; + + // 判断下一个是否是嵌套的 FormList,或者是 onlyForLabel/hidden 项 const nextOption = listOptions[listIndex + 1]; const isNextNestedFormList = nextOption && nextOption.render === FORM_ITEM_RENDER_ENUM.FORM_LIST; + const isNextNoButton = nextOption && !isShowButton(nextOption); - // 如果是最后一个表单项,或者下一个是嵌套的 FormList,则在其后添加操作按钮 - if (listIndex === listOptions.length - 1 || isNextNestedFormList) { + // 如果是最后一个需要显示按钮的项,或者下一个是嵌套的 FormList,或者下一个不需要按钮,则在其后添加操作按钮 + const lastButtonIndex = findLastButtonIndex(); + if (listIndex === lastButtonIndex || isNextNestedFormList || isNextNoButton) { + delete formItemProps.dependencies; + delete formItemProps.shouldUpdate; return (