AntDesign AFormItem中表单元素嵌套及校验

目录

一、问题

二、解决方法

三、总结


一、问题

1.需求希望:选择某个单选项后出现 复选框。

2.在 AFormItem中需要 ARadioGroup 和 AFormItem 组合使用;但是实际书写时发现会报错并且单选项和复选框同时存在时会报错

bash 复制代码
web/:6Warning: [ant-design-vue: Form.Item] FormItem can only collect one field item,
 you haved set `ARadioGroup`, `ACheckboxGroup` 2 field items. 
You can set not need to be collected fields into `a-form-item-rest`

大致意思就是说:一个AFormItem中不能同时存在 ARadioGroup和ACheckboxGroup;可以改用AFormItemRest

二、解决方法

  1. 尝试在ARadioGroup和ACheckboxGroup外面套一层 AFormItemRest,确实不报错了,但是吧AFormItemRest通过打印发现配置的rules规则不会执行,不支持表单校验了......(这个表单其他地方都是用AForm的rules校验的,不能因为这个重新自己写一个吧)
html 复制代码
 <AFormItem
                v-for="dataItem of contentItem.data"
                :key="dataItem.key"
                :label="dataItem.label"
                :required="dataItem.required"
                :rules="dataItem.rules ? dataItem.rules : undefined"
                class="data-item"
                :name="dataItem.key"
              >
                <template v-if="dataItem.type === 'radio'">
                  <AFormItemRest>
                    <div class="grid">
                      <ARadioGroup
                        v-model:value="(formData as any)[dataItem.key]"
                        class="text-base"
                        :options="dataItem.options"
                      >
                      </ARadioGroup>

                      <template v-if="dataItem.optionDetails">
                        <template v-for="(optionDetail, optionKey) in dataItem.optionDetails" :key="optionKey">
                          <ACheckboxGroup
                            v-model:value="(formData as any)[optionDetail.key]"
                            class="text-base"
                            :options="optionDetail.options"
                          ></ACheckboxGroup>
                        </template>
                      </template>
                    </div>
                  </AFormItemRest>
                </template>
    
                <template v-else>
                  <span class="text-base"> {{ (formData as any)[dataItem.key] }} </span>
                </template>
                <template v-if="dataItem.tips">
                  <div class="text-ctext03">{{ dataItem.tips }}</div>
                </template>
              </AFormItem>

2.还能怎么办呢?思考、乱改,放弃、再改

3.既然一个AFormItem中只能放一个表单元素,那如果ACheckboxGroup也放在一个AFormItem中,好像也满足这条规则。竟然对了,也不报错了,而且表单校验依然支持

html 复制代码
              <AFormItem
                v-for="dataItem of contentItem.data"
                :key="dataItem.key"
                :label="dataItem.label"
                :required="dataItem.required"
                :rules="dataItem.rules ? dataItem.rules : undefined"
                class="data-item"
                :name="dataItem.key"
              >
                <template v-if="dataItem.type === 'radio'">
                  <div class="grid">
                    <ARadioGroup
                      v-model:value="(formData as any)[dataItem.key]"
                      class="text-base"
                      :options="dataItem.options"
                    >
                    </ARadioGroup>

                    <template v-if="dataItem.optionDetails">
                      <template v-for="(optionDetail, optionKey) in dataItem.optionDetails" :key="optionKey">
                        <AFormItem
                          v-if="(formData as any)[dataItem.key]?.toString() === optionKey?.toString()"
                          :name="optionDetail.key"
                          :rules="optionDetail.rules"
                        >
                          <ACheckboxGroup
                            v-model:value="(formData as any)[optionDetail.key]"
                            class="text-base"
                            :options="optionDetail.options"
                          ></ACheckboxGroup>
                        </AFormItem>
                      </template>
                    </template>
                  </div>
                </template>
         
                <template v-else>
                  <span class="text-base"> {{ (formData as any)[dataItem.key] }} </span>
                </template>
                <template v-if="dataItem.tips">
                  <div class="text-ctext03">{{ dataItem.tips }}</div>
                </template>
              </AFormItem>

4.最终效果

三、总结

1.一个AFormItem中如果希望嵌套多个 表单元素,需要把每个表单元素都有一个AFormItem包裹 ,不会报错并且支持表单校验

2.使用AFormItemRest也支持嵌套多个表单元素,但是里面的元素不支持表单校验

/*

希望对你有帮助!

如有错误,欢迎指正,谢谢!

*/

相关推荐
一袋米扛几楼986 分钟前
【网络安全】SIEM -Security Information and Event Management 工具是什么?
前端·安全·web安全
小陈工17 分钟前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
Cobyte26 分钟前
3.响应式系统基础:从发布订阅模式的角度理解 Vue2 的数据响应式原理
前端·javascript·vue.js
竹林81830 分钟前
从零到一:在React前端中集成The Graph查询Uniswap V3池数据实战
前端·javascript
Mintopia37 分钟前
别再迷信"优化":大多数性能问题根本不在代码里
前端
倾颜38 分钟前
接入 MCP,不一定要先平台化:一次 AI Runtime 的实战取舍
前端·后端·mcp
军军君0140 分钟前
Three.js基础功能学习十八:智能黑板实现实例五
前端·javascript·vue.js·3d·typescript·前端框架·threejs
恋猫de小郭40 分钟前
Android 上为什么主题字体对 Flutter 不生效,对 Compose 生效?Flutter 中文字体问题修复
android·前端·flutter
Moment42 分钟前
AI全栈入门指南:一文搞清楚NestJs 中的 Controller 和路由
前端·javascript·后端
禅思院42 分钟前
前端架构演进:基于AST的常量模块自动化迁移实践
前端·vue.js·前端框架