编写antd配置表单组件

整体思路

  1. 抽取formitem的配置数组:包含组件类型、名称、label名称,相关的opts和扩展的opts,传递进入组件
  2. 组件通过Form.create()进行表单创建,能够带有form属性。并且上层组件引用后能够ref的方式获取form进行操作处理
  3. 基于form能够抽取出来,上层组件能够对下层组件进行调用和操作,在此基础上还能够进行扩展配置和扩展功能的实现
  4. 组件通过props中获取配置数组,动态生成FormItem的表单元素,实现动态配置表单的功能
  5. 组件通过在create中的mapPropsToFields中将外部对象数据data绑定到内部表单Item中了

实例实现代码,基于react和antd,类似的组件实现思路一致

组件js

import React, { PureComponent } from 'react';
import { Row, Form, Input, Col } from 'antd';
import FormItem from 'antd/lib/form/FormItem';
import BaseDataForm from '.'; // 通用组件
class _BaseDataForm extends PureComponent { // 默认属性
defaultProps = {
fields: [], // 外部传递进来的配置数据
} state = {
} getFromItems = () => {
const { form } = this.props;
const { getFieldDecorator } = form;
const { fields, labelCol, wrapperCol } = this.props;
const children = [];// 定义返回值数组
const fieldsinput = fields || [];
const labelColinput = labelCol || 7;
const wrapperColinput = wrapperCol || 15;
const formItemLayout = {
labelCol: { span: labelColinput },
wrapperCol: { span: wrapperColinput },
};
for (let index = 0; index < fieldsinput.length; index += 1) {
const field = fieldsinput[index];
let item = '';
if (field.type === 'Input' || field.type === 'password') {
// this.props.form.getFieldDecorator(id, options) 使用功能这个包装空间,id等于属性名
item = getFieldDecorator(field.name, field.fieldDecoratorOps)(
<Input {...field.elementOpts} />
);
}
// 拼装表格
children.push(
<Col key={index}>
<FormItem {...formItemLayout} label={field.label}>
{item}
</FormItem>
</Col>
);
}
return children;
} render() {
return (
<Form>
<Row>{this.getFields()}</Row>
</Form>
);
}
}

导入js

// 经过Form.create包装过的组件会自带this.props.form
const BaseDataForm = Form.create({
mapPropsToFields: (props) => {
// 把父组件的属性映射到表单项上(如:把 Redux store 中的值读出),需要对返回值中的表单域数据用 Form.createFormField 标记,注意表单项将变成受控组件, error 等也需要一并手动传入
const { fields = [], data = [] } = props;
const values = {};
fields.map(item => {
const fieldName = item.name;
let value = data[fieldName];
if (fieldName.indexOf('.' !== -1)) {
try {
// eslint-disable-next-line no-eval
value = eval('data.' + fieldName);
// 特殊多层结构数据获取值
} catch (error) {
// eslint-disable-next-line no-console
console.error(error);
}
}
if (value !== undefined && value !== null) {
// 特殊数据处理
}
values[fieldName] = Form.createFormField({ value });
return item;
});
return values;
},
})(_BaseDataForm);
export default BaseDataForm;

实例js

class Test extends PureComponent {

  exampleFields = [
{
type: 'Input',
name: 'test',
label: '输入1',
fieldDecoratorOps: {}, // 表单绑定属性
elementOpts: {}, // 标签属性
},
{
type: 'Input',
name: 'test2',
label: '输入2',
fieldDecoratorOps: {}, // 表单绑定属性
elementOpts: {}, // 标签属性
},
]; saveFormRef = (form) => {
this.form = from;
} getFormData = () => {
return this.form.getFieldsValue();
} render() {
return (
<BaseDataForm
ref={this.saveFormRef} // 通过ref将对应的表单from组件映射出来,能够直接调用
data={{}} // data在创建表单的时候做了一次绑定,这个绑定能够将当前值显示进去
fields={exampleFields}
/>
);
}
}

编写antd配置表单组件的更多相关文章

  1. Vue 2.x折腾记 - (17) 基于Ant Design Vue 封装一个配置式的表单组件

    前言 写了个类似上篇搜索的封装,但是要考虑的东西更多. 具体业务比展示的代码要复杂,篇幅太长就不引入了. 效果图 2019-04-25 添加了下拉多选的渲染,并搜索默认过滤文本而非值 简化了渲染的子组 ...

  2. 封装react antd的form表单组件

    form表单在我们日常的开发过程中被使用到的概率还是很大的,比如包含了登录.注册.修改个人信息.新增修改业务数据等的公司内部管理系统.而在使用时这些表单的样式如高度.上下边距.边框.圆角.阴影.高亮等 ...

  3. 实现Ant Design 自定义表单组件

    Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...

  4. 【09】react 之 表单组件

    不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...

  5. Django form表单 组件

    目录 Django form表单 组件 Form 组件介绍 普通方式手写注册功能 使用form组件实现注册功能 Form 常用字段与插件 常用字段(必备) 字段参数(必备) 内置验证(必备) 自定义效 ...

  6. 从后端到前端之Vue(六)表单组件

    表单组件 做项目的时候会遇到一个比较头疼的问题,一个大表单里面有好多控件,一个一个做设置太麻烦,更头疼的是,需求还总在变化,一会多选.一会单选.一会下拉的,变来变去的烦死宝宝了. 那么怎么解决这个问题 ...

  7. 微信小程序-表单组件

    button 按钮 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 示例代码: /** wxss **/ ...

  8. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  9. Form( 表单) 组件

    本节课重点了解 EasyUI 中 Form(表单)组件的使用方法, 这个组件不依赖于任何组件.一. 加载方式表单组件只能在 JS 区域设置,首先定义一张表单.<form id="box ...

随机推荐

  1. Oracle define用法简介教程

    目录 1.define常量用法 2.&和&&符号用法 继上一篇博客Oracle绑定变量学习笔记,再写一篇define变量的简单教程 @ 1.define常量用法 注意:defi ...

  2. C#上手练习6(方法语句1)

    方法是将完成同一功能的内容放到一起,方便书写和调用的一种方式,也体现了面向对象语言中封装的特性. 定义方法的语法形式如下. 访问修饰符    修饰符    返回值类型    方法名(参数列表){    ...

  3. go-变量

    变量使用注意事项 变量三种声明方式 var i int //使用默认值 var num = 10.2 //类型推导 num := "tom" //左侧不能同名 //多变量声明 nu ...

  4. python-execjs(调用js)

    一.安装 pip3 install PyExecJS 电脑上要有nodejs环境 二.使用 一.获取js字符串 首先将js保存至于本地文件或者你可以可以直接读到内存,必须让js以字符串的形式展示 注意 ...

  5. DataGridView中在新增行时怎样设置每个Cell单元格的字体样式

    场景 DataGridView怎样实现添加.删除.上移.下移一行: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10281414 ...

  6. 这可能最简单的一种PS图片特效,零基础小白教程

    不少小伙伴都想学习PS,可是又觉得PS很难,学了一段时间却还是做不出什么惊艳的效果,没关系!小编今天就来教大家做一个超级简单的图片特效,就算是小白也能轻松学会!我们先来看看图片效果~ 想知道怎么做吗? ...

  7. DDL、DML、TCL

    一.DDL 1.创建表(CREATE) (1)数据库对大小写不敏感,只对字符串大小写敏感. (2)使用create关键字创建表.(-- 表示注释). 格式: CREATE TABLE 表名( 字段名1 ...

  8. 【JavaWeb】JSTL标签库

    JSTL标签库 JSTL标准标签库: JSTL用于简化JSP开发,提高代码的可读性与可维护性: JSTL由SUN(Oracle)定义规范,由Apache Tomcat团队实现: 引用JSTL核心库 核 ...

  9. React Hooks究竟是什么呢?

    摘要: React Hooks原理解析. 原文:快速了解 React Hooks 原理 译者:前端小智 我们大部分 React 类组件可以保存状态,而函数组件不能? 并且类组件具有生命周期,而函数组件 ...

  10. fiddler---Fiddler性能测试

    从上几篇文章中我们了解到Fiddler可以帮助我们做接口测试,修改断点,抓包等应用,但是你可能想想不到,Fiddler也能做简单的性能测试 性能测试 性能测试是通过自动化的测试工具模拟多种正常.峰值以 ...