Lazy loaded image
技术分享
『Vue3+Antd』通用表单(Form)、表格(Table)封装
Words 4087Read Time 11 min
2026-1-16
2026-2-26
type
Post
status
Published
date
Jan 16, 2026
slug
summary
tags
Vue
category
技术分享
password
😀
说在前面: 前端业务开发离不开的一个业务场景:自定义表单、表格,目的是为了将“数据逻辑”与“视图表现”解耦,实现高效率的复用。本组件基于Vue3框架 + Ant Design Vue进行深度封装。

🖼️ 样式案例

notion image
 

🔑 核心代码

Type类型

DataForm表单封装

核心代码作用深度解析

A. 配置驱动 (Schema-Driven)

核心点: 模板中使用了大量的 v-if="item.type === 'xxx'"作用: 将表单的“样子”转化为“数据”。开发人员不再需要写繁琐的 HTML 标签,只需要维护一个 JSON 数组。这极大地提高了开发 CRUD 页面(增删改查)的速度。

B. 联动逻辑处理 (isHide)

核心点: hide 属性可以是一个函数:hide: (model) => model.role !== 'admin'作用: 实现了声明式联动。当用户修改表单某个值时,Vue 的响应式系统会触发 isHide 重新计算,从而自动显示或隐藏相关字段,无需手动编写复杂的监听逻辑。

C. 自动取值与数据绑定 (dicData)

核心点: 内部封装了 item.request 逻辑。 作用: 解决了表单下拉框数据源获取的痛点。它实现了“高内聚”,即:关于“性别”字段的所有逻辑(标签、字段名、数据来源、校验规则)都写在一个对象里,而不是散落在页面的 onMounted 和各个变量中。

D. 插槽 (Slot) 的灵活性

核心点: item.type === 'slot''formSlot'作用: 解决封装组件的“黑盒”问题。如果某个表单项非常特殊(例如需要嵌入一个复杂的图形验证码或地图选择器),通过插槽可以直接在父组件编写 HTML,兼顾了封装的高效性自定义的灵活性

E. 嵌套字段支持

核心点: model[item.field[0]][item.field[1]]作用: 处理了复杂的数据结构。例如后端需要 contact: { phone: '...' } 这种嵌套格式,该组件通过判断 field 是否为数组,实现了深层绑定,避免了手动在提交前组装数据的麻烦。
 

DataTable表单封装

搜索条件持久化

 

深拷贝重置

结合前面提供的 DataTable 代码,deepClone 主要发挥了以下作用:
  1. 搜索重置 (onReset): 当你重置表单时,代码通过深拷贝恢复了 searchForm 的初始状态。如果没有深拷贝,你修改搜索框的内容时,可能会无意中修改了定义的“初始配置对象”,导致下次重置时无法回到最初的状态。这在 Vue 中经常会导致 bug(例如:表单修改了数据,但还没点保存,列表里的数据就跟着变了)。
  1. 配置隔离: 在 DataTable 中,将父组件传入的 extraButtons 进行深拷贝后存入 tableOper.extraButtons。这样,组件内部对按钮状态的逻辑处理(如动态显示/隐藏)不会污染到父组件传入的原始配置文件。
 

🏃‍ 使用模板

 
上一篇
前端与产品审美提升资源库
下一篇
『Rn+Expo』相关组件、插件的使用