当前位置: 首页 > news >正文

突发奇想,还未实践,在Vben5的Antd模式下,将表单从「JS 配置化」改写成「模板可视化」形式(豆包版)

在 Vben5 的 Antd 模式下,完全可以将表单从「JS 配置化」改写成「模板可视化」形式,把表单项直接写在 Vue 模板中,更直观且符合传统 Vue 开发习惯。以下是完整的改写示例,保留原功能但结构更清晰:

改写思路

  1. 放弃 JS 中的 schema 配置:将每个表单项(如 Input、Select、DatePicker)直接写在模板的 <Form> 标签内。
  2. FormItem 包裹表单项:通过 FormItemname(对应原 fieldName)、labelrules 等属性绑定字段信息和校验规则。
  3. 保留 useVbenForm 核心能力:仍用该钩子获取表单实例,实现提交、校验等功能,确保和原逻辑一致。

完整改写代码

<template><!-- 表单容器:绑定表单实例,配置布局和提交逻辑 --><Form:form="formInstance":layout="formLayout":scroll-to-first-error="true"@submit="onSubmit"class="grid-cols-1"><!-- 1. 字段1:Input(必填) --><FormItemname="field1"label="字段1":rules="[{ required: true, message: '请输入字段1' }]"><Input placeholder="请输入" class="w-full" /></FormItem><!-- 2. 字段2:Input(必填 + 默认值) --><FormItemname="field2"label="默认值(必填)":rules="[{ required: true, message: '请输入字段2' }]"initial-value="默认值" <!-- 对应原 defaultValue -->><Input placeholder="请输入" class="w-full" /></FormItem><!-- 3. 字段3:Input(非必填 + 默认值) --><FormItemname="field3"label="默认值(非必填)"initial-value="默认值"><Input placeholder="请输入" class="w-full" /></FormItem><!-- 4. 字段31:Input(自定义校验:最少1个字符) --><FormItemname="field31"label="自定义信息":rules="[{ required: true, min: 1, message: '最少输入1个字符' }]"><Input placeholder="请输入" class="w-full" /></FormItem><!-- 5. 字段4:邮箱Input(邮箱格式校验) --><FormItemname="field4"label="邮箱":rules="[{ required: true, type: 'email', message: '请输入正确的邮箱' }]"><Input placeholder="请输入" class="w-full" /></FormItem><!-- 6. 数字输入:InputNumber(必填) --><FormItemname="number"label="数字":rules="[{ required: true, message: '请输入数字' }]"><InputNumber placeholder="请输入" class="w-full" /></FormItem><!-- 7. 下拉选择:Select(必填) --><FormItemname="options"label="下拉选":rules="[{ required: true, message: '请选择选项' }]"><Selectallow-clearfilter-optionplaceholder="请选择"show-searchclass="w-full"><Select.Option value="1">选项1</Select.Option><Select.Option value="2">选项2</Select.Option></Select></FormItem><!-- 8. 单选组:RadioGroup(必填) --><FormItemname="radioGroup"label="单选组":rules="[{ required: true, message: '请选择一项' }]"><RadioGroup class="w-full"><Radio value="1">选项1</Radio><Radio value="2">选项2</Radio></RadioGroup></FormItem><!-- 9. 多选组:CheckboxGroup(必填) --><FormItemname="checkboxGroup"label="多选组":rules="[{ required: true, message: '请至少选择一项' }]"><CheckboxGroup name="cname" class="w-full"><Checkbox value="1">选项1</Checkbox><Checkbox value="2">选项2</Checkbox></CheckboxGroup></FormItem><!-- 10. 单独复选框:Checkbox(必填:同意协议) --><FormItemname="checkbox"label="" <!-- 空label,避免多余占位 -->:rules="[{ required: true, message: '请勾选同意协议' }]"><Checkbox class="w-full">我已阅读并同意</Checkbox></FormItem><!-- 11. 日期选择:DatePicker(必填) --><FormItemname="datePicker"label="日期选择框":rules="[{ required: true, message: '请选择日期' }]"><DatePicker class="w-full" /></FormItem><!-- 12. 区间选择:RangePicker(必填) --><FormItemname="rangePicker"label="区间选择框":rules="[{ required: true, message: '请选择区间' }]"><RangePicker class="w-full" /></FormItem><!-- 13. 密码输入:InputPassword(必填) --><FormItemname="password"label="密码":rules="[{ required: true, message: '请输入密码' }]"><InputPassword placeholder="请输入" class="w-full" /></FormItem><!-- 提交按钮 --><FormItem><Button type="primary" html-type="submit">提交表单</Button></FormItem></Form>
</template><script lang="ts" setup>
import { ref } from 'vue';
import { message } from 'ant-design-vue';
// 导入 Vben 表单核心组件和钩子
import { useVbenForm } from '#/adapter/form';
// 导入 Antd 基础组件(Vben 适配版)
import { Form, FormItem, Input, InputNumber, Select, RadioGroup, Radio, CheckboxGroup, Checkbox, DatePicker, RangePicker, InputPassword, Button 
} from '#/adapter/component';// 1. 初始化表单:获取表单实例(替代原 schema 配置)
const { form: formInstance } = useVbenForm();// 2. 表单布局(对应原 layout: 'horizontal')
const formLayout = ref('horizontal');// 3. 提交函数(和原逻辑完全一致)
const onSubmit = (values: Record<string, any>) => {message.success({content: `form values: ${JSON.stringify(values)}`,});
};
</script>

关键改动说明

  1. 模板结构更直观
    每个表单项都以「FormItem 包裹组件」的形式写在模板中,字段名(name)、标签(label)、校验规则(rules)一目了然,无需在 JS 中找 schema 配置。

  2. 保留原功能不变

    • 校验规则:通过 FormItemrules 属性直接绑定(如邮箱校验、必填校验),逻辑和原 schema 一致。
    • 默认值:用 FormIteminitial-value 替代原 defaultValue
    • 布局和提交:layout 用变量控制,提交函数 onSubmit 完全复用。
  3. 组件引入更清晰
    直接从 #/adapter/antd 导入需要的组件(如 SelectDatePicker),和模板中的使用一一对应,降低理解成本。

优势

  • 可视化强:表单项的层级、顺序、组件类型在模板中直接可见,便于快速修改(比如调整表单项顺序,只需拖动模板中的 FormItem)。
  • 调试方便:若某个表单项有问题,直接定位到模板中的对应位置,无需在 JS 的 schema 数组中查找。
  • 学习成本低:符合 Vue 开发者“模板写结构、JS 写逻辑”的习惯,新接手的同事更容易上手。

如果需要添加更复杂的逻辑(如动态表单项、联动校验),也只需在模板中通过 v-ifv-for 或组件事件实现,比在 JS 配置中写 renderwatch 更直观。


文章转载自:

http://KOdKShd5.kcwkt.cn
http://U6rR6Eon.kcwkt.cn
http://vdvkaOv6.kcwkt.cn
http://ldxLEVPF.kcwkt.cn
http://qWGqvNaF.kcwkt.cn
http://vvUs1Qda.kcwkt.cn
http://xp8DShLY.kcwkt.cn
http://nChEMBqa.kcwkt.cn
http://n3lLBJiN.kcwkt.cn
http://ba5S5CNv.kcwkt.cn
http://6TqHNDie.kcwkt.cn
http://QCov6cwk.kcwkt.cn
http://tdM6dRLX.kcwkt.cn
http://XaVEbbOe.kcwkt.cn
http://L9h2TOQ9.kcwkt.cn
http://asFikDCS.kcwkt.cn
http://6QajZgJI.kcwkt.cn
http://Dt6J967I.kcwkt.cn
http://vGiWscT4.kcwkt.cn
http://0BUF1Vx9.kcwkt.cn
http://LKZbKfok.kcwkt.cn
http://fIvyhEKa.kcwkt.cn
http://pECpcSUV.kcwkt.cn
http://BgovwdvH.kcwkt.cn
http://BjWdrmmN.kcwkt.cn
http://HeYTfPOL.kcwkt.cn
http://9bxLY72Y.kcwkt.cn
http://Ule7zatv.kcwkt.cn
http://gTx6hcIJ.kcwkt.cn
http://MAJhN6Si.kcwkt.cn
http://www.dtcms.com/a/368744.html

相关文章:

  • Flash Attention:突破大模型推理内存瓶颈的革命性算法
  • 【正则表达式】 正则表达式的分组和引用
  • 具身智能的工程落地:视频-控制闭环的实践路径
  • E+H音叉开关FTL31-AA4M2AAWBJ
  • Android 权限机制默认授权分析
  • 深入理解 HarmonyOS Stage 模型与 UIAbility 生命周期管理
  • Vue3中的数据响应【4】
  • 因泰立科技:用激光雷达重塑智能工厂物流生态
  • 【Windows】通过 runas 命令实现多用户权限测试的完整流程
  • LangChain实战(十六):构建基于SQL数据库的数据分析Agent
  • Struts2 工作总结
  • 软件设计模式之单例模式
  • 小迪安全v2023学习笔记(七十八讲)—— 数据库安全RedisCouchDBH2database未授权CVE
  • 【Go】P2 Golang 常量与变量
  • Leetcode—721. 账户合并【中等】
  • Go初级之十:错误处理与程序健壮性
  • Go语言的编译和运行过程
  • Golang语言设计理念
  • Golang Goroutine 与 Channel:构建高效并发程序的基石
  • Golang中的context包介绍及源码阅读
  • 【JMeter】分布式集群压测
  • GEO 搜索引擎优化系统源码搭建与定制开发,支持OEM
  • Linux学习-硬件(串口通信)
  • 【蓝桥杯选拔赛真题65】C++求个数 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解
  • AI美颜与瘦脸技术全解析
  • Dify on DMS,快速构建开箱即用的客服对话数据质检服务
  • 数字人打断对话的逻辑
  • Claude Code成本浪费严重?80%开支可省!Token黑洞解密与三层省钱攻略
  • 基于STM32的交通灯设计—紧急模式、可调时间
  • (未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件