编写antd配置表单组件
编写antd配置表单组件
整体思路
- 抽取formitem的配置数组:包含组件类型、名称、label名称,相关的opts和扩展的opts,传递进入组件
- 组件通过Form.create()进行表单创建,能够带有form属性。并且上层组件引用后能够ref的方式获取form进行操作处理
- 基于form能够抽取出来,上层组件能够对下层组件进行调用和操作,在此基础上还能够进行扩展配置和扩展功能的实现
- 组件通过props中获取配置数组,动态生成FormItem的表单元素,实现动态配置表单的功能
- 组件通过在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配置表单组件的更多相关文章
- Vue 2.x折腾记 - (17) 基于Ant Design Vue 封装一个配置式的表单组件
前言 写了个类似上篇搜索的封装,但是要考虑的东西更多. 具体业务比展示的代码要复杂,篇幅太长就不引入了. 效果图 2019-04-25 添加了下拉多选的渲染,并搜索默认过滤文本而非值 简化了渲染的子组 ...
- 封装react antd的form表单组件
form表单在我们日常的开发过程中被使用到的概率还是很大的,比如包含了登录.注册.修改个人信息.新增修改业务数据等的公司内部管理系统.而在使用时这些表单的样式如高度.上下边距.边框.圆角.阴影.高亮等 ...
- 实现Ant Design 自定义表单组件
Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...
- 【09】react 之 表单组件
不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...
- Django form表单 组件
目录 Django form表单 组件 Form 组件介绍 普通方式手写注册功能 使用form组件实现注册功能 Form 常用字段与插件 常用字段(必备) 字段参数(必备) 内置验证(必备) 自定义效 ...
- 从后端到前端之Vue(六)表单组件
表单组件 做项目的时候会遇到一个比较头疼的问题,一个大表单里面有好多控件,一个一个做设置太麻烦,更头疼的是,需求还总在变化,一会多选.一会单选.一会下拉的,变来变去的烦死宝宝了. 那么怎么解决这个问题 ...
- 微信小程序-表单组件
button 按钮 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 示例代码: /** wxss **/ ...
- Vue组件之自定义表单组件
今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...
- Form( 表单) 组件
本节课重点了解 EasyUI 中 Form(表单)组件的使用方法, 这个组件不依赖于任何组件.一. 加载方式表单组件只能在 JS 区域设置,首先定义一张表单.<form id="box ...
随机推荐
- angularjs 一篇文章看懂自定义指令directive
壹 ❀ 引 在angularjs开发中,指令的使用是无处无在的,我们习惯使用指令来拓展HTML:那么如何理解指令呢,你可以把它理解成在DOM元素上运行的函数,它可以帮助我们拓展DOM元素的功能.比如 ...
- Saiku ui-settings接口404错误避免(二十九)
Saiku ui-settings接口404错误避免 自己手动编译的saiku ,不知道为什么前端总是报错 /saiku/rest/saiku/info/ui-settings 404NotFo ...
- MySQL数字类型学习笔记
数字类型 最近在看<MySQL技术内幕:SQL编程>并做了笔记,所以本博客是一篇笔记类型博客,分享出来方便自己复习,也可以帮助他人 整型 类型 占用空间 最小值(SIGNED) 最大值(S ...
- P3376 网络最大流模板(Dinic + dfs多路增广优化 + 炸点优化 + 当前弧优化)
### P3376 题目链接 ### 这里讲一下三种优化的实现以及正确性. 1.dfs多路增广优化 一般的Dinic算法中是这样的,bfs() 用于标记多条增广路,以至于能一次 bfs() 出多次 d ...
- [转]探索ASP.NET Core 3.0 系列
这是该系列的第一篇文章:探索ASP.NET Core 3.0. 第1部分-探索新的项目文件Program.cs和通用主机(本文) 第2部分-比较ASP.NET Core 3.0模板之间的Startup ...
- 【LOJ#575】【LNR#2】不等关系(容斥,动态规划,分治FFT)
[LOJ#575][LNR#2]不等关系(容斥,动态规划,分治FFT) 题面 LOJ 题解 一个暴力\(dp\),设\(f[i][j]\)表示考虑完了前\(i\)个位置,其中最后一个数在前面所有数中排 ...
- Java匹马行天下之学编程的起点——编程常识知多少
学编程的起点——编程常识知多少 前言: 刚去大学那会,我就知道我被录取的学院是软件学院,还知道一点就是软件学院主要是学电脑的,但具体要学什么其实一无所知.待的时间久了,慢慢的,像“编程”.“软件”.“ ...
- java高并发系列 - 第4天:JMM相关的一些概念
JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和安全性将会受到严重挑战.如何保证一个线程可以看到正确的数据呢?这个问题看起来很白痴.对于串行程 ...
- .net core入门-跨域访问配置
Asp.net Core 跨域配置 一般情况WebApi都是跨域请求,没有设置跨域一般会报以下错误 No 'Access-Control-Allow-Origin' header is prese ...
- .NET MVC后台获得VIEW对应的html
一..Net Core Mvc下获得 建立一个帮助类,如下: using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Render ...