「前端组件开发」越折腾越有趣,封装了一个表单组件

简介: 最近折腾代码简洁之路,先折腾了详情页,最近准备折腾一下表单组件,准备二次封装,提升代码复用率。

折腾前

我在封装详情页功能的时候,其实最早的雄心壮志是做低代码平台。看了几篇文章,再看看自己的小键盘以及手里的项目排期,就放弃了。我和我的梦想终究是隔着时间、人力、能力等多重重险阻。

但是,我转念一想,如果把前端的功能简化,不就有时间做低代码平台的开发了吗?对于自己的机智,反手就是一个赞。

于是开始计划,最大化的模块化和组件化前端功能,这样一来,每次新需求开发就会非常的便捷。而后台系统,最复杂也最啰嗦的就是表单功能,所以我准备将表单做成组件化的。

表单功能不用再重复的码一些个输入框、下拉项、日期控件等代码,是不是节省了很多时间,节省出来的时间又可以去研究低代码开发,是不是离财富自由更近了一步。(✧◡✧)

基于React框架开发,使用的antd UI组件库。

整体设计

功能介绍

antd提供的Form表单控件,已经集成了数据录入、校验以及对应样式等。但是我们实际开发的时候,后台系统的添加、编辑、其他数据录入等表单弹窗,内容项大多是Input、Radio、CheckBox等,每次开发都重复码一些代码。所以我根据日常开发经验,将常规的表单项做了进一步的封装处理。

封装处理之后,只需将表单项类型、key值等关键变量放到一个数组对象中,通过props传递到表单组件中即可。

当表单填写完成之后,填写的数据会通过callback函数回传到表单弹窗中。

参数介绍

参数

说明

类型

默认值

data

表单默认数据

object

{}

list

表单项展示数组

any[]

[]

layout

表单布局

object

-

callback

提交操作的回调函数

(value,list) => void

getFormRef

获取formRef方法

(formRef) => void

表单项类型

目前支持的表单项类型如下,未来如果有新的开发思路,会继续增加

类型

key

输入框

input

数值型输入框

inputNumber

日期

date

下拉选择器

select

多选框

checkbox

单选框

radio

文本域

textArea

纯文本展示

text

细节处理

细节处理只放关键代码,完整代码已经放到github上了,github地址在文末。下面主要将设计思路和实现方式

类型区分

list数组,根据每个元素的fieldtype区分不同的展示内容。

{
list.map((formItem, formIndex) => {
return (
<Fragmentkey={formIndex}>        {formItem.fieldtype==='input'&&inputContent(formItem)}
        {formItem.fieldtype==='inputNumber'&&inputNumberContent(formItem)}
......</Fragment>    );
  });
}

input

  • 输入框使用的antd提供的Input组件。
  • 如果输入框类型的内容项,展示内容不单单是输入框,可能还包含其他的比如提示文案,可以使用children进行内容替换。
/** * 输入框类型 * @param {object} item 表单项 */constinputContent=item=> {
return (
<>      {item.children? (
item.children      ) : (
<Form.Itemlabel={item.label} name={item.key} rules={item.rules} disabled={item.disabled}><Inputplaceholder={`请输入${item.label}`} /></Form.Item>)}</>);};

inputNumber

  • 输入框使用的antd提供的InputNumber组件。
  • 数字类型的输入框的特别之处在于输入的数值可以设置最小值和最大值、小数点、每次可以改变的步数。这些都可以通过设置对应的属性进行控制。
  • 数字类型的输入框支持展示单位,通过unit变量控制单位的展示。
<Form.Itemlabel={item.label} className={classnames({ required: item.required })}><Form.ItemnoStylename={item.key} rules={item.rules} disabled={item.disabled}><InputNumberstyle={{ width: '50%' }} step={item.step} min={item.min} max={item.max} precision={item.precision} /></Form.Item>  {item.unit&&<spanstyle={{ marginLeft: '10px' }}>{item.unit}</span>}</Form.Item>

date

  • 日期类型使用的antd提供的DatePicker组件。
  • 日期类型支持不同的时间展示方式,通过format变量实现。
  • 日期类型可以设置可选时间范围,可选范围包括起日和止日,也可单独设置起日或止日。
  • 写文档的时候突然意识到,实际日期类型也可以支持日期精确到年或是月或是日,目前组件没有实现这个功能,后续实现之后再更新文档。(灵感就是这么一瞬间就来了)

select

  • 下拉选择器类型使用的antd提供的Select组件。
  • 下拉选择器操作一般获取的是value,如果需要拿到选中的节点文本 label,通过onChange时间设置option变量的值为选择的下拉项的值。
  • 有一种特殊情况,当下拉项选择其他时,需要输入其他选项的具体值,所以增加了可输入其他的文本域功能。
{/* 下拉项中有需要文本输入的情况 */}
{item.textArea.code&&item.option.value===item.textArea.code?textAreaContent(item.textArea) : null}

checkbox

  • 多选框类型使用的antd提供的Checkbox组件。

radio

  • 单选框类型使用的antd提供的Radio组件。
  • 有一种特殊情况,当单选项选择否或拒绝时,需要输入原因或者说明,所以增加了可输入其他的文本域功能。

textArea

  • 文本域类型使用的antd提供的Input.TextArea组件。
  • 当文本域类型表单项和其他表单项组合展示时,展示的布局值需要和组合的表单项一致,所以根据type类型做了特殊处理。
letareaLayout= {};
if (type==='other') {
areaLayout= { wrapperCol: { offset: layout.labelCol, span: layout.wrapperCol } };
label=null;
}

text

纯展示类型,展示具体内容即可。

如何使用

引入组件

  • 一般公共组件会放在components。完整的代码已经放github上了,github地址在文末。,这里不在重复,主要将一下实现思路。
  • data,基础数据对象,里面放一些表单初始化的数据,比如编辑的时候,表单需要回显之前填过的数据,所以我把这部分数据放到了data里面。
  • list,这个是重点,它是一个数组对象,放完整的表单数据,所有需要展示的表单项都要放到list数组中,
  • callback,是一个回调函数,提交表单时,需要请求后端提供的接口进行数据上报。callback函数中的参数value包含所有表单项的操作值。
  • getFormRef,是一个操作函数,有一些弹窗的操作按钮需要特殊处理,不是通过From组件上的onFinish方法进行的操作,所以需要将formRef返回到弹窗中,获取实际的操作。
importBaseFormUIfrom'@/components/BaseFormUI';
......constconfig= {
data: {
...data,
initFieldsValueFlag: true,
  },
list: list,
getFormRef: getFormRef,
callback: callback,
};
......<BaseFormUI {...config} />


弹窗展示

数据提交

如果后端接口没有特殊要求,value对象中的数据基本就满足了,如果需要其他值可以从list中获取。

总结

github地址:react-antd-manage

功能完成之后,发现没有自己最开始设想的那么复杂。当然了,也跟功能的兼容程度有关系,不适用特别复杂的表单,比如表格类的表单。

未来希望伴随着学习和进步,进一步完善表单组件。

目录
相关文章
|
19天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
27 1
|
22天前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
30天前
|
前端开发 JavaScript
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
149 1
|
1月前
|
前端开发 JavaScript 开发者
Web组件:一种新的前端开发范式
【10月更文挑战第9天】Web组件:一种新的前端开发范式
38 2
|
1月前
|
JavaScript 前端开发 数据安全/隐私保护
前端技术分享:使用Vue.js构建响应式表单
【10月更文挑战第1天】前端技术分享:使用Vue.js构建响应式表单
|
1月前
|
前端开发 JavaScript Go
前端开发趋势:从响应式设计到Web组件的探索
【10月更文挑战第1天】前端开发趋势:从响应式设计到Web组件的探索
38 3
|
30天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
127 2
|
30天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
37 0
|
30天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
30天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。