实现效果如下:

当点击按钮的时候 对一个FormItem里的多个input/或者是input和select进行校验  同时通过Rol/Col实现布局

Rselect/input组件封装的组件如下field.js:

import React from 'react';
import { Select, Input, Row, Col } from 'antd';
import _ from 'underscore';
import './index.less';
const Option = Select.Option;
const uiPrefix = "certificate-field"
class CertificateField extends React.Component { constructor(props) {
super(props);
this.state = {
yearlists: [],//时间下拉框列表
cities: [],//城市下拉框列表
years: undefined,
cityId: undefined,
warrantNumber: undefined,
};
}
static defaultProps = {
cities: [],
yearlists: [],
hasYear: true,
hasCity: true,
readonly: true,
hasWarrantNum: true,
years: (new Date()).getFullYear(),
cityId: 1,
} getStateFromProps(props) {
let { value = {} } = props;
return { ...this.parseDataFromInput(value) };
}
parseDataFromInput(value) {
let { years, cityId, warrantNumber } = value;
years = years ? ('' + years) : undefined;
cityId = cityId ? ('' + cityId) : undefined;
warrantNumber = warrantNumber ? ('' + warrantNumber) : undefined return { years, cityId, warrantNumber };
} onBlur = () => {
let { years, cityId, warrantNumber } = this.state;
let yearlistsName = this.getTextFromValue("yearlist");
let citieName = this.getTextFromValue("citie");
const { onBlur } = this.props;
if (onBlur) {
const {
hasYear,
hasCity,
hasWarrantNum,
} = this.props;
let unFull = true;
if (unFull && hasYear == true && !years) {
unFull = false;
}
if (unFull && hasCity == true && !cityId) {
unFull = false;
}
if (unFull && hasWarrantNum == true && !warrantNumber) {
unFull = false;
}
if (unFull) {
onBlur(
JSON.stringify({
years,
cityId,
warrantNumber,
// yearlistsName,
// citieName,
})
)
} else {
onBlur(undefined)
}
}
} getTextFromValue = (type) => {
let resource;
let value;
let text = ''; if (type === 'city' || type === 'years') {
resource = this.state.cities;
value = this.state.cityId;
}
else {
resource = this.state[type + 's'];
value = this.state[type + 'Id'];
} let item = null;
if (resource !== undefined && resource.length > 0) {
item = resource.find(({ id }) => id === +value);
} text = text || '';
return item ? item.text : text;
} fireChange = () => {
let { years, cityId, warrantNumber } = this.state;
const { onChange } = this.props;
if (onChange) {
const {
hasYear,
hasCity,
hasWarrantNum,
} = this.props;
let unFull = true;
if (unFull && hasYear == true && !years) {
unFull = false;
}
if (unFull && hasCity == true && !cityId) {
unFull = false;
}
if (unFull && hasWarrantNum == true && !warrantNumber) {
unFull = false;
}
if (unFull) {
onChange(
JSON.stringify({
years,
cityId,
warrantNumber,
}))
} else {
onChange(undefined)
}
}
}
getColSpan = () => {
const result = {
select: 4,
input: 2
}
const {
hasYear,
hasCity,
} = this.props;
if (!hasYear) {
result.input += 4
}
if (!hasCity) {
result.input += 4
}
return result; } componentWillReceiveProps(nextProps) { // 父组件重传props时就会调用这个方法
this.getStateFromProps(nextProps);
const oldProps = this.props;
let { years, cityId, warrantNumber } = nextProps;
if (years != oldProps.years &&
cityId != oldProps.cityId &&
warrantNumber != oldProps.warrantNumber) {
this.setState({
years,
cityId,
warrantNumber
}, () => {
this.initData(nextProps)
this.fireChange(nextProps)
})
}
} componentDidMount() {
let { years, cityId, warrantNumber } = this.props;
this.setState({
years,
cityId,
warrantNumber
}, () => {
this.initData(this.props)
// this.fireChange(this.props)
})
} initData(props) {
let { initSelectData = {} } = this.props;//获取初始化的值(时间/城市 下拉框的值)
let { yearLists = [], cities = [] } = initSelectData;
let currentYear = (new Date()).getFullYear();
if (yearLists.length == 0) {
const startYear = 2016;
for (let i = 0; i <= currentYear - startYear; i++) {
yearLists.push({ text: startYear + i, id: startYear + i })
}
}
if (cities.length == 0) {
cities = [{ text: "鹤岗市", id: 1 }]
}
this.setState({
yearLists,
cities,
})
} onyearsChange = (years, noEvent) => {
years = '' + years;
this.setState({ years },this.fireChange);
} onCityChange = (cityId, noEvent) => {
cityId = '' + cityId;
this.setState({ cityId }, this.fireChange);
} onwarrantNumberChange = (e) => {
const warrantNumber = e.target.value;
this.setState({ warrantNumber }, this.fireChange);
} selectOptions = (constantsTypes, fieldOp) => {
fieldOp = fieldOp || { key: 'id', value: 'text' };
// {key: 'xxxx', value: 'xxxx'}
if (!_.isArray(constantsTypes)) {
const options = [];
_.each(
constantsTypes,
(value, key) => {
let trueValue;
let disabled = false;
if (_.isObject(value)) {
trueValue = value.value;
disabled = value.disabled;
}
else {
trueValue = value;
}
return options.push(<Option key={key} value={key} disabled={disabled}>{trueValue}</Option>);
}
);
return options;
}
// [{key: 'xxxx', value: 'xxxx'}]
// [1, 3, 4]
return constantsTypes.reduce(
(options, value, key) => {
let realKey;
let display;
if (_.isObject(value)) {
realKey = `${value[fieldOp.key]}`;
display = value[fieldOp.value];
}
else {
realKey = `${key}`;
display = value;
} options.push(<Option key={realKey} value={realKey}>{display}</Option>);
return options;
},
[]
);
} render() {
let {
years,
cityId,
yearLists = [],
cities = [],
warrantNumber
} = this.state;
let {
hasYear,
hasCity,
readonly = true,
hasWarrantNum,
detailPlaceholder,
} = this.props;
if (readonly) {
cityId = this.getTextFromValue('city')
}
const colSpan = this.getColSpan();
return (
<Row className={`${uiPrefix}`}>
{hasYear &&
<Col
span={colSpan.select}
>
<Row>
<Col span={22} style={{ paddingRigth: "0" }}>
<Select
style={{ height: 32 }}
value={years}
placeholder="请选择"
onChange={this.onyearsChange}
onBlur={this.onBlur}
>
{this.selectOptions(yearLists)}
</Select>
</Col>
</Row>
</Col>
}
{hasCity &&
<Col span={colSpan.select}>
<Row>
<Col span={22}>
<Select
disabled={readonly}
value={cityId}
placeholder="请选择"
onChange={this.onCityChange}
onBlur={this.onBlur}
>
{this.selectOptions(cities)}
</Select>
</Col>
</Row>
</Col>
}
{
hasWarrantNum &&
<Col span={colSpan.select}>
{/* <div className={`${uiPrefix}-select-item`}> */}
{/* 不动产权第 */}
<Input
maxLength={16}
// style={{ width: 120 }}
value={warrantNumber}
placeholder={detailPlaceholder}
onChange={this.onwarrantNumberChange}
onBlur={this.onBlur}
/>
{/* 号 */}
{/* </div> */}
</Col>
} </Row>
);
}
}
export default CertificateField;

需要调用入口页面index.js:

import React from "react";
import { Form, Input, Button, Radio, message, Modal } from "antd";
import { CertificateField } from "components";
class Schhouse extends React.Component {
onSearchHandle = () => {
//注意validateFields里的fields,要和getFieldDecorator中的fields保持一致 否则拿不到值
this.props.form.validateFields(["fields"], (err, fieldsValue) => {
console.log(fieldsValue, "fieldsValue")
if (err) {
return;
}
})
} render() {
const { getFieldDecorator } = this.props.form;
return (
<>
<Form>
<Form.Item label="标签">
{getFieldDecorator('fields', {
rules: [{ required: true, message: '请输入标签对应内容' }],
})(
<CertificateField />
)}
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" onClick={this.onSearchHandle.bind(this)}>
查询并办理
</Button>
</Form.Item>
</Form>
</>
)
}
} export default Form.create()(Schhouse);

非常完美!!!

在一个formitem中多input的验证方法-antd的验证的更多相关文章

  1. 多个Fragment在一个activity中通过按钮的展示方法

    fragment使用方法 1. 创建主Mainactivity extends AppCompatActivity 2. Oncreate & setContentView 3. 完成XML的 ...

  2. jquery validate 自定义验证方法

    query validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则. 这里就来聊一聊jquery validate的自定义验证. jquery validate有一个方法 ...

  3. jquery validate 自定义验证方法 日期验证

    jquery validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则. 这里就来聊一聊jquery validate的自定义验证. jquery validate有一个方 ...

  4. Android中的onActivityResult和setResult方法的使用

    如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方 ...

  5. jQuery Validate 表单验证插件----自定义一个验证方法

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...

  6. ASP.NET 表单验证方法与客户端(浏览器)服务器交互机制的故事

    想到这个问题完全是一个意外吧,是在寻找另外一个问题答案的过程中,才对验证方法与浏览器服务器交互机制的关系有了清晰的认识. 先说下验证方法,验证方法分为前台验证和后台验证. 前台验证就是类似jQuery ...

  7. vuex中filter的使用 && 快速判断一个数是否在一个数组中

    vue中filter的使用 computed: mapState({ items: state => state.items.filter(function (value, index, arr ...

  8. validation验证器指定action中某些方法不需要验证

    今天写代码时,遇到个问题,在一个输入数据的页面有一个按钮,单击会发出请求从数据库中取数据,在这里出现问题,单击该按钮,配置的validation起作用,该请求没有到达后台的action 点击按钮选择作 ...

  9. ASP.NET开发中主要的字符验证方法-JS验证、正则表达式、验证控件、后台验证

    ASP.NET开发中主要的字符验证方法-JS验证.正则表达式.验证控件.后台验证 2012年03月19日 星期一 下午 8:53 在ASP.NET开发中主要的验证方法收藏 <1>使用JS验 ...

随机推荐

  1. Gerrit评审代码流程注意事项

    Gerrit管理CR流程时要注意下面两大事项: (一)格式规范 这部分主要是根据公司或者团队的要求规范来撰写格式,这里不做统一介绍了:格式规范的宗旨是让修改的代码和业务需求能够匹配.可追溯. (二)评 ...

  2. Java文件与类动手动脑

    动手动脑1: 使用Files. walkFileTree()找出指定文件夹下所有大于指定大小(比如1M)的文件. package classJava; import java.io.IOExcepti ...

  3. laravel 解决 sql mode only_full_group_by

    this is incompatible with sql_mode=only_full_group_by 先贴报错是这样的哦,sql 中使用到了 group by 然后这是mysql-5.7以上版本 ...

  4. C++使用taskkill 命令强制结束进程

    一:查看 taskkill 命令和参数的方法 window系统下,快捷键win + R 打开运行 ,输入cmd回车,在 cmd 里面输入: taskkill /?  二:语法: taskkill [/ ...

  5. LeetCode 938. 二叉搜索树的范围和

    题目链接:https://leetcode-cn.com/problems/range-sum-of-bst/ 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 二叉搜 ...

  6. 金蝶云星空Python案例地址

    https://club.kingdee.com/forum.php?mod=viewthread&tid=1235461

  7. BZOJ2809&&LG1552 APIO2012派遣(线段树合并)

    BZOJ2809&&LG1552 APIO2012派遣(线段树合并) 题面 自己找去 HINT 简化一题面就是让你从每个点的子树中以\(<=m\)的代价选取尽可能多的点,然后乘上 ...

  8. H5_0013:CSS特色样式集

    按比例变化,同时又限制最大宽高 ".start-wrap {", " width:40%;", " top: 83.21%;", " ...

  9. pycharm+anaconda在Mac上的配置方法 2019.11.29

    内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...

  10. VS的使用技巧记录:

    调试: F5:调试运行 会在编译前进行debug F10:单步步过   遇到函数不会进入函数内部执行 F11:单步步入   遇到函数会进入函数一步一步执行 ctrl+F5:直接运行不调试