// standardForm.js
import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { Form, Input, Row, Col, Button } from 'antd'; const FormItem = Form.Item;
// 默认的layout
export const defaultLabelColSpan = 8;
const defaultFormItemLayout = {
labelCol: { span: defaultLabelColSpan },
wrapperCol: { span: 16 },
}; const responsive = {
1: { xs: 24 },
2: { xs: 24, sm: 12 },
3: { xs: 24, sm: 12, md: 8 },
4: { xs: 24, sm: 12, md: 6 },
}; // 监听表单变化
const handleFormChange = (props, changedValues, allValues) => {
if (props.onChange) {
props.onChange(allValues);
}
};
class StandardForm extends PureComponent {
// 渲染单个表单项
renderFormItem = ({ item, layout, form, columns }) => {
const { label, key, required, component, options = {}, rules, extra } = item;
const col = columns > 4 ? 4 : columns;
return (
<Col {...responsive[col]} key={key}>
<FormItem key={key} label={label} {...layout} extra={extra}>
{form.getFieldDecorator(key, {
normalize: val => (typeof val === 'string' ? val.trim() : val),
...options,
form, // 处理复杂的表单校验
rules: rules || [{ required, message: `${label}不能为空` }],
})(component || <Input />)}
</FormItem>
</Col>
);
}; onSubmit = e => {
e.preventDefault();
const { onSubmit } = this.props;
if (onSubmit) {
onSubmit();
}
}; render() {
// items格式即为上文配置的表单项
const { onSubmit, items, layout, columns, form } = this.props;
return (
<Form onSubmit={onSubmit && this.onSubmit}>
<Row gutter={{ md: 8, lg: 24, xl: 48 }} type="flex" align="top">
{items.map(item => this.renderFormItem({ item, layout, form, columns }))}
</Row>
<Button type="primary" htmlType="submit" style={{ display: 'none' }}>
搜索
</Button>
</Form>
);
}
} // colums [1,2,3,4]
StandardForm.propTypes = {
items: PropTypes.array.isRequired,
layout: PropTypes.object,
columns: PropTypes.number,
form: PropTypes.object.isRequired,
}; StandardForm.defaultProps = {
layout: defaultFormItemLayout,
columns: 1,
}; export default Form.create({ onValuesChange: handleFormChange })(StandardForm);
<StandardForm
ref={formRef => {
this.formRef = formRef;
}}
items={formConfig}
layout={{
labelCol: { span: 7 },
wrapperCol: { span: 17 },
}}
columns={3}
/>

基于ant design form的二次封装的更多相关文章

  1. 基于Ant Design Vue封装一个表单控件

    开源代码 https://github.com/naturefwvue/nf-vue3-ant 有缺点本来是写在最后的,但是博文写的似乎有点太长了,估计大家没时间往下看,于是就把有缺点写在前面了,不喜 ...

  2. 封装一个漂亮的ant design form标签组件

    在ant design 的form组件中 能用于提交的组件比较少,所以我在这写了一个可以单选.多选标签提交的组件,调用非常简单. 代码: import React,{Fragment} from 'r ...

  3. ant design pro(二)布局

    一.概述 参看地址:https://pro.ant.design/docs/layout-cn 其实在上述地址ant-design上已经有详细介绍,本文知识简述概要. 页面整体布局是一个产品最外层的框 ...

  4. 基于Ant Design UI框架的React项目

    概述 这款基于React开发的UI框架,界面非常简洁美观,在这篇文章中我主要为大家介绍一下如何用Ant开始搭建React项目 详细 代码下载:http://www.demodashi.com/demo ...

  5. android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

    网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次 ...

  6. react 编写 基于ant.design 页面的参考笔记

    前言 因为我没有系统的学习 react,是边写边通过搜索引擎找相对的问题,看 ant.design的 中文文档 编写的一个单页面, 以下的笔记都是写 gksvideourlr 时记录的. 重新设定表单 ...

  7. 基于bootstrap table配置的二次封装

    准备 jQuery js css 引用完毕 开始 如果对bootstrap table 的方法与事件不熟悉: Bootstrap table方法,Bootstrap table事件 <table ...

  8. axios基于常见业务场景的二次封装

    axios axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在前端框架中的应用也是特别广泛,不管是vue还是react,都有很多项目用axios作为网络 ...

  9. Vue.js 自定义组件封装实录——基于现有控件的二次封装(以计时器为例)

    在本人着手开发一个考试系统的过程中,出现了如下一个需求:制作一个倒计时的控件显示在试卷页面上.本文所记录的就是这样的一个过程. 前期工作 对于这个需求,自然我想到的是有没有现成的组件可以直接使用(本着 ...

随机推荐

  1. 说说Java观察者模式

    观察者模式是对象行为模式中的一种,在平时项目中经常被用来解耦对象之间的依赖. 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并自动更新.别名:De ...

  2. 关于bitset

    https://www.zybuluo.com/ysner/note/1327705 原理 \(bitset\)的原理是将一大堆值为\(0/1\)的数压成一个数. 操作 通过\(i>>x\ ...

  3. WEB开发框架系列教程 (一)快速创建解决方案

    执行<华东信息辅助开发工具> 程序 打开程序界面如下图 输入用户名.密码进行登录 如果暂时还没有用户名和密码,点击注册提供机器码给管理员进行注册. 管理员QQ:93346562 下图是:点 ...

  4. HDU 2340 Obfuscation (暴力)

    题意:给定一篇文章,将每个单词的首尾字母不变,中间顺序打乱,然后将单词之间的空格去掉,得到一个序列,给出一个这样的序列,给你一个字典,将原文翻译出来. 析:在比赛的时候读错题了,忘记首尾字母不变了,一 ...

  5. mount: unknown filesystem type 'ntfs'(转载)

    转自:http://www.siutung.org/post/455/ 今天将USB移动硬盘挂在CentOS上准备将压缩包拷贝下来的.  结果挂载移动硬盘的时候却提示: mount: unknown ...

  6. python 面向对象四 继承和多态

    一.继承 class Animal(object): def run(self): print('Animal is running...') class Dog(Animal): def run(s ...

  7. (10)用css建立表单

    1.用css建立表单 本篇资料主要介绍使用css设置表单元素的方法. 表单是网页与用户交互所不可缺少的元素,表单是网页的访问者进行交互的接口,例如大家都常遇到的:网上注册.网上登录.网上交易.网上投票 ...

  8. .Net Core之Configuration

    ASP.NET CORE 中自动集成了应用配置,支持从以下 源 处获取配置键值对 命令行 环境变量 内存 文件配置 其中文件配置是我们最常用的方式,默认文件是.json的json格式文件,摒弃了以往. ...

  9. 【原创】CentOS 6.5 中安装 Mysql 5.6,并远程连接Mysql

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.在安装CentOS时,若选择的是Basic Server(可支持J2EE开发),则新安装好的CentOS系统中默认是已经安装了一个mysq ...

  10. 给Ambari集群里安装可视化分析利器工具Hue步骤(图文详解)

    扩展博客 以下,是我在手动的CDH版本平台下,安装Hue. CDH版本大数据集群下搭建Hue(hadoop-2.6.0-cdh5.5.4.gz + hue-3.9.0-cdh5.5.4.tar.gz) ...