基于ant design form的二次封装

// 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}
          />

原文地址:https://www.cnblogs.com/zhuzeliang/p/11082664.html

时间: 2024-07-31 23:22:58

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

ant design form表单的时间处理

ant design form表单的时间处理 用ant design开发程序时,会碰到时间的字段,效果如下: 那么该怎么处理呢?可以在表单中使用如下代码: import { DatePicker } from 'antd' import Moment from 'moment' <FormItem label="开始时间" {...formItemLayout}> { getFieldDecorator('sdate', { initialValue: item.sdate

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

网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次都要又一次编写网络请求,于是基于我比較熟悉的asynchttpclient又一次二次封装了一个网络请求框架. 思路:网络请求层唯一的功能就是发送请求,接收响应数据,请求取消,cookie处理这几个功能,二次助封装后这些功能能够直接调用封装好的方法就可以. 二次助封装代码例如以下: 1.功能接口: /

自写一个漂亮的ant design form提交标签

在ant design 的form组件中 能用于提交的组件比较少,所以我在这写了一个可以单选.多选标签提交的组件,调用非常简单. 代码: 1 import React,{Fragment} from 'react'; 2 import { Tag,Icon,Input } from 'antd'; 3 export interface TagDataType{ 4 data:string, 5 color:string, 6 key:string 7 } 8 export interface P

如何利用Facebook的create-react-app脚手架创建一个基于ant design mobile的项目

引言: create-react-app是Facebook发布的一款全局的命令行工具用来创建一个新的项目. 通常我们开始做一个react web或者 app 项目的时候,都会自己利用 npm 或者 yarn 安装项目所需要的一些依赖,再写 webpack.config.js ,一系列复杂的配置,搭建好开发环境后写src源代码. 现在,如果你想要搭建一个完整的 react 项目环境,已经不需要自己动手布置许许多多的东西,利用 create-react-app 工具,就能轻松帮你配置好一个 reac

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

axios axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在前端框架中的应用也是特别广泛,不管是vue还是react,都有很多项目用axios作为网络请求库.我在最近的几个项目中都有使用axios,并基于axios根据常见的业务场景封装了一个通用的request服务. 业务场景: 全局请求配置. get,post,put,delete等请求的promise封装. 全局请求状态管理. 取消重复请求. 路由跳转取消当前页面请求. 请求携带token,

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

在本人着手开发一个考试系统的过程中,出现了如下一个需求:制作一个倒计时的控件显示在试卷页面上.本文所记录的就是这样的一个过程. 前期工作 对于这个需求,自然我想到的是有没有现成的组件可以直接使用(本着不重复发明轮子的原则).于是我就在 GitHub 上找寻.确实找到了不少,但是与需求之间的差距还比较大.从零开始写又不太现实(时间摆在那里,加之自己的前端也是刚学,还没有从零开始手撸一个控件的能力),所以在已有组件的基础上进行二次封装便成了一个比较可行的方法(几乎也是唯一解).遂在 npm 上以 c

python+selenium十:selenium的二次封装

from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.common.action_chains im

Ant Design of React 框架使用总结1

1..  antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品. 特性 1.提炼自企业级中后台产品的交互语言和视觉风格. 2.开箱即用的高质量 React 组件. 3.使用 TypeScript 构建,提供完整的类型定义文件. 4.全链路开发和设计工具体系. 支持环境 现代浏览器和 IE9 及以上(需要 polyfills). 支持服务端渲染. Electron 原文地址:https://www.cnblogs.com/andy-lehhax

通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design Button

前面学习了Blazor的特点.环境搭建及基础知识,现在我们尝试的做个实际的组件. Ant Design是蚂蚁金服是基于Ant Design设计体系的 UI 组件库,主要用于研发企业级中后台产品.目前官方是基于React和Angular实现的,今年也推出了Vue的实现.其组件涵盖面较广,其组件风格及交互效果还是比较惊艳的,后面准备利用Ant Design的样式文件利用Blazor模仿几个组件的实现. 由于也是新学的Blazor开发,可能实现的方式有些笨拙,希望高手提出宝贵意见,先看看实现的Butt