Antd Procomponent 之 proForm - 高级表单

本文作者系360奇舞团前端开发工程师

ProForm 在原来的 Form 基础上增加一些语法糖和更多的布局设置,帮助我们快速的开发一个表单。同时添加一些默认行为,让我们的表单默认好用。分步表单,Modal 表单,Drawer 表单,查询表单,轻量筛选等多种 layout 可以覆盖大部分的使用场景,脱离复杂而且繁琐的表单布局工作,更少的代码完成更多的功能。

ProForm 高级表单

  • 使用 initialValues设置默认值。

  • 可以使用 ProFormDependency 实现表单联动或者做一些依赖。

  • ProForm 的 onFinish 是个 Promise。

  • 使用 onValuesChange 监听某个值。

  • 如果要使用自定义的组件可以用 Form.Item 包裹后使用,支持与 antd 的 Form混用。

// 设置整体默认值
<ProForm initialValues={obj} />// 设置单个控件的
<ProForm onValuesChange={(changeValues) => console.log(changeValues)}><ProFormText initialValue="prop"/>
</ProForm>// 相互依赖的组件联动
<ProForm><ProFormDependency name={['name']}>{({ name }) => {return (<ProFormSelectoptions={[{value: 'chapter',label: '盖章后生效',},]}width="md"name="useMode"label={`与《${name}》合同约定生效方式`}/>)}}
</ProFormDependency>
</ProForm>// 使用自定义组件
<ProForm><Form.Item name="switch" label="Switch" valuePropName="checked"><Switch /></Form.Item>
</ProForm>

ProFormFields 表单项

ProFormFields 表单项本质上是 Form.Item 和 组件的结合,每个表单项都支持 fieldProps

ProFormText 是 FormItem + Input 的产物,可以类比于以下的代码:

const ProFormText = (props) => {return (<ProForm.Item {...props}><Input placeholder={props.placeholder} {...props.fieldProps} /></ProForm.Item>)
}

组件列表

51b962b4530cb8e9e2cadacf8d86538a.jpeg

ProFormList 数据结构化

  • ProFormList 录入结构化的多维数组数据。

  • ProFormFieldSet 录入结构化的一维数组数据。

  • ProFormDependency 数据依赖的相关组件

ProFormList

ProFormList 与 Form.List API 基本相同,自带操作按钮:删除和复制和新增按钮

ProFormList API

e7a628cb40f47cc2a406d8cdf367dde1.jpeg

actionRef 操作 & actionGuard 拦截器

const actionRef = useRef<FormListActionType<{ name: string }>>();const actionGuard = {beforeAddRow: async (defaultValue, insertIndex, count) => {return new Promise((resolve) => {console.log(defaultValue?.name, insertIndex, count);setTimeout(() => resolve(true), 1000);});},beforeRemoveRow: async (index, count) => {const row = actionRef.current?.get(index as number);console.log('--->', index, count, row);return new Promise((resolve) => {if (index === 0) {resolve(false);return;}setTimeout(() => resolve(true), 1000);});},
};return (/*** @name 获取到 list 操作实例* @description 可用删除,新增,移动等操作** @example  actionRef?.current.add?.({},1);* @example  actionRef?.current.remove?.(1);* @example  actionRef?.current.move?.(1,2);* @example  actionRef?.current.get?.(1);*/<><Space><Buttontype="primary"onClick={() => {const list = actionRef.current?.getList();actionRef.current?.add({name: '新增' + list?.length,});}}>增加一行</Button><ButtondangeronClick={() => {actionRef.current?.remove(1);}}>删除一行</Button><ButtononClick={() => {actionRef.current?.move(1, 0);}}>移动到第一行</Button><Buttontype="dashed"onClick={() => {const row = actionRef.current?.get(1);console.log(row);}}>获取一行数据</Button><Buttontype="dashed"onClick={() => {const row = actionRef.current?.getList();console.log(row);}}>获取所有数据</Button></Space><ProFormList actionGuard={actionGuard} actionRef={actionRef}><ProFormText key="useMode" name="name" label="姓名" /></ProFormList></>
)

ProFormFieldSet

ProFormFieldSet 可以将内部的多个 children 的值组合并且存储在 ProForm 中

<ProFormFieldSetname="list"label="组件列表"// 支持 两种方式,type="group" 会用input.group 包裹// 如果不配置 默认使用 spacetype="group"transform={(value: any) => ({ startTime: value[0], endTime: value[1] })}
><ProFormText width="md" /><ProFormText width="md" /><ProFormText width="md" />
</ProFormFieldSet>

ProFormDependency

ProFormDependency 是一个简化版本的 Form.Item,它默认内置了 noStyle 与 shouldUpdate,我们只需要配置 name 来确定我们依赖哪个数据,ProFormDependency 会自动处理 diff 和并且从表单中提取相应的值

name 参数必须要是一个数组,如果是嵌套的结构可以这样配置 name={['name', ['name2', 'text']]}。配置的 name 的值会在 renderProps 中传入。name={['name', ['name2', 'text']]} 传入的 values 的值 为 { name: string,name2: { text:string } }

<ProFormDependency name={['name']}>{({ name }) => {return (<ProFormSelectoptions={[{value: 'chapter',label: '盖章后生效',},]}width="md"name="useMode"label={`与《${name}》合同约定生效方式`}/>);}}
</ProFormDependency>

补充:ProForm 和 EditableTable 可以同时使用

注意:ProComponents 专注于中后台的 CRUD, 预设了相当多的样式和行为。这些行为和样式更改起来会比较困难,如果你的业务需要丰富的自定义建议直接使用 Ant Design。

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

cfcdd654d7194b3ce17f8689c8346a5b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/164489.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 第 369 场周赛题解

Leetcode 第 369 场周赛题解 Leetcode 第 369 场周赛题解题目1&#xff1a;2917. 找出数组中的 K-or 值思路代码复杂度分析 题目2&#xff1a;2918. 数组的最小相等和思路代码复杂度分析 题目3&#xff1a;2919. 使数组变美的最小增量运算数思路代码复杂度分析 题目4&#xff1…

腾讯、巨量等头部营销平台方法论

媒体、营销与市场生态正处于新一轮变革期&#xff0c;尤其是进入移动互联网时代后&#xff0c;行业话语权由创意人转向互联网人&#xff0c;营销的风向与规则&#xff0c;也越来越由掌握流量与资源的头部平台引领。 巨变之下&#xff0c;企业只有从本质层面&#xff0c;认清变…

最全的软件测试面试题(上)

1.熟悉软件测试流程&#xff0c;能够独立完成软件测试相关工作 软件测试流程&#xff1a;首先由公司高层进行立项&#xff0c;产品给出产品说明书&#xff0c;需求人员进行需求分析&#xff0c;接着进行需求评审&#xff08;参加人员&#xff1a;项目组里的人&#xff0c;产品&…

Samtec连接器技术前沿 | 全新对准功能确保测试和测量应用中的精确对准

【摘要/前言】 Samtec开发了一种创新的易于使用的对准技术&#xff0c;以确保测试和测量应用中的精密、高频压缩安装连接器的峰值性能。下面解释了我们所看到的趋势&#xff0c;并概述了我们针对出现的常见对准挑战所开发的解决方案。 【问题所在】 随着数据传输率的不断提高…

数据结构算法-回溯算法

引言 在原神的世界中&#xff0c;小森决定挑战自我&#xff0c;踏上了寻找风神的迷宫——风之迷宫。这个迷宫就像是一个巨大的电玩城&#xff0c;让小森感到困惑和无助。他站在迷宫的入口&#xff0c;看着眼前乱糟糟的路径&#xff0c;内心充满了不安和焦虑。 “派蒙&#xf…

【GO】项目import第三方的依赖包

目录 一、导入第三方包 1.执行命令 2.查看go环境变量参数 3.查看go.mod文件的变化情况 二、程序里如何import 1. import依赖包 2. 程序编写 本次学习go如果依赖第三方的包&#xff0c;并根据第三方的包提供的接口进行编程&#xff0c;这里需要使用go get命令。下面将go…

线性【SVM】数学原理和算法实现

一. 数学原理 SVM是一类有监督的分类算法&#xff0c;它的大致思想是&#xff1a;假设样本空间上有两类点&#xff0c;如下图所示&#xff0c;我们希望找到一个划分超平面&#xff0c;将这两类样本分开&#xff0c;我们希望这个间隔能够最大化来使得模型泛化能力最强。 如上图所…

open clip论文阅读摘要

看下open clip论文 Learning Transferable Visual Models From Natural Language Supervision These results suggest that the aggregate supervision accessible to modern pre-training methods within web-scale collections of text surpasses that of high-quality crowd…

hadoop配置文件自检查(解决常见报错问题,超级详细!)

本篇文章主要的内容就是检查配置文件&#xff0c;还有一些常见的报错问题解决方法&#xff0c;希望能够帮助到大家。 一、以下是大家可能会遇到的常见问题&#xff1a; 1.是否遗漏了前置准备的相关操作配置&#xff1f; 2.是否遗的将文件夹(Hadoop安装文件夹&#xff0c;/dat…

图及谱聚类商圈聚类中的应用

背景 在O2O业务场景中&#xff0c;有商圈的概念&#xff0c;商圈是业务运营的单元&#xff0c;有对应的商户BD负责人以及配送运力负责任。这些商圈通常是一定地理围栏构成的区域&#xff0c;区域内包括商户和用户&#xff0c;商圈和商圈之间就通常以道路、河流等围栏进行分隔。…

Promise链式调用改写成async/await

首先&#xff0c;Promise链式调用和async/await都是用来解决异步调用层层嵌套的问题。 promise解决了回调地狱的问题&#xff0c;把异步任务完成后的处理函数换个位置放&#xff1a;传给then方法&#xff0c;并支持链式调用&#xff0c;避免层层回调。用catch方法捕获错误。 …

现一个智能的SQL编辑器

补给资料 管注公众号&#xff1a;码农补给站 前言 目前我司的多个产品中都支持在线编辑 SQL 来生成对应的任务。为了优化用户体验&#xff0c;在使用 MonacoEditor 为编辑器的基础上&#xff0c;我们还支持了如下几个重要功能&#xff1a; 多种 SQL 的语法高亮多种 S…