antd的form表单自定义验证validator的注意事项

validator 自定义验证的方法里,每个if 和else里都要加callback,不然会导致所有rule验证失效,页面上没填都不提示,或者直接导致form表单无法触发提交。

当验证不通过,控制台会打印,验证不通过的antd组件下会显示红框红字报错信息:
点击提交,验证的报错信息只在浏览器的控制台显示,页面上啥提示也没有

// 先把antd form表单的这些个方法拿到
const { getFieldDecorator, getFieldValue, validateFieldsAndScroll, setFields } = props.form; // Form.create()(你的class/函数组件名)之后,form对象就集成到了props里

callback() 不可少:

<Form.Item label="模式">
    {getFieldDecorator("p_mode", {
        rules: [
            { required: true, message: "请选择模式" },
            { validator: validateMode },
        ],
    })(
        <Radio.Group>
            <Radio value={1}>模式一</Radio>
            <Radio value={2}>模式二</Radio>
        </Radio.Group>
    )}
</Form.Item>

const validateMode = (rule, value, callback) => {
        if (value === 2) {
        	// 做一些其他操作,比如要判断另一个form.item项的值是否填了,同时符合再请求接口,and so on
            const deptCode = getFieldValue("dept_code");
            if (deptCode) {
                callback();
                // 获取接口数据
                // 。。。
            } else {
                callback("请先选择所属部门");
            }
        } else {
            callback();
        }
    };

for循环的写法也是一样的,逢 if 和 else 就要加callback()
const initConfig = [
	{
		lable: "充值额一",
		name: "amount1",
		value: amountConfig?.data?.amount1,  // 存到redux里的 接口返回的数据对象amountConfig
		key: "amount1",
	},
	{
		lable: "充值额二",
		name: "amount2",
		value: amountConfig?.data?.amount2,
		key: "amount2",
	},
	{
		lable: "充值额三",
		name: "amount3",
		value: amountConfig?.data?.amount3,
		key: "amount3",
	},
	{
		lable: "充值额四",
		name: "amount4",	
		value: "其他金额",
		rangeValue: [
			amountConfig?.data?.custom_amount_min,
			amountConfig?.data?.custom_amount_max,
		],
		key: "amount6",
	},
];

const handleBalanceLimit = (rule: any, value: any, callback: any) => {
	if (value) {
		const moneyReg=/(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/;
		if (moneyReg.test(value)) {
			if (Number(value) <= 5000) {
				for (const theConfig of initConfig) {
					const chkboxParValue = getFieldValue(theConfig.name);
					if (chkboxParValue) {
						if (Number(value) < Number(chkboxParValue)) {
							callback("用户余额最大值需大于等于单次充值金额");
							break;
						} else {
							// 清空数组里当前被验证的充值额文本框下的error信息
							setFields({
								[theConfig.name]: {
									value: chkboxParValue,
									// error:['xxx']  当你不设置error这个属性的时候,就表示清空form表单验证的error信息及红框状态
								},
							});
							// callback(); // 备注警示:这个不能加,跟上面这个setFields冲突(具体是error属性),会导致验证报错信息它不显示。
							continue;
						}
					} else {
						callback();
						continue;
					}                        
				}
			} else {
				callback("用户余额最大值不可超过5000");
			}
		} else {
			callback("请输入正确的金额,精确到小数点后两位");
		}
	} else {
		callback();
	}
};

react 的函数组件中,示例 .tsx文件:

import React, { useState } from "react";
import { connect, DispatchProp } from "react-redux";
import { Form, Radio} from "antd";
export interface Props extends DispatchProp {
    isShow: boolean;
    closePopup: (val) => void;
    onSubmitSuccess: (val) => void;
}

const AddDept: React.FunctionComponent<Props> = props => {
	const { isShow, closePopup, onSubmitSuccess } = props;
    /** 初始化当前页state */
    const initState = {
        addLoading: false,        
    };
    const [state, setState] = useState(initState); // react hook的方法,解构出来的这俩变量名,随意取,比如 const [yourPageState,setYourPageState] = useState(initState); 第二个变量是方法,跟react的setState一样用法,用来给第一个变量设置值的。
    const { getFieldDecorator, getFieldValue, setFieldsValue, setFields } = props.form;

	const validateMode = (rule, value, callback) => {
        if (value === 2) {
        	// 做一些其他操作,比如要判断另一个form.item项的值是否填了,同时符合再请求接口,and so on
            const deptCode = getFieldValue("dept_code");
            if (deptCode) {
                callback();
                // 获取接口数据
                // 。。。
            } else {
                callback("请先选择所属部门");
            }
        } else {
            callback();
        }
    };

	/** 提交表单 */
    const handleSubmit = (e) => {
        e.preventDefault();
        props.form.validateFieldsAndScroll((err, values) => {
            if (!err) {
                console.info("验证通过: ", values);
                setState({
                    ...state,
                    addLoading: true,
                });
                // 调用添加部门接口
                // 。。。
            }
        });
    };

	return (
		<Form onSubmit={onSubmitIt}>
			<Form.Item label="模式">
		        {getFieldDecorator("p_mode", {
		            rules: [
		                { required: true, message: "请选择模式" },
		                { validator: validateMode },
		            ],
		        })(
		            <Radio.Group>
		                <Radio value={1}>模式一</Radio>
		                <Radio value={2}>模式二</Radio>
		            </Radio.Group>
		        )}
		    </Form.Item>
		    <Form.Item>
                <Button type="primary" htmlType="submit">
                    添加
                </Button>
            </Form.Item>
		<Form>
	)
};
const AddDeptWithForm = Form.create<Props>()(AddDeptment); // create之后 props里才有form对象
const mapStateToProps = (state: RootState) => {
    return {
        // 存到redux的值
        moduleState: state.app["your-manage/add-dept"],
    };
};
export default connect(mapStateToProps)(AddDeptWithForm);
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用 Ant Design Vue 的 `a-form` 表单时,自定义校验器可以使用 `validator` 属性来指定。默认情况下,校验器会对表单项进行非空判断。如果你想要自定义校验器但不想进行非空判断,可以在校验器函数中手动判断。 例如,你可以定义一个自定义校验器函数来检查输入值是否为正整数: ```javascript const validatePositiveInteger = (rule, value, callback) => { if (value && !/^[1-9]\d*$/.test(value)) { callback(new Error('请输入正整数')) } else { callback() } } ``` 在这个例子中,我们首先判断了输入值是否存在,如果存在,再使用正则表达式来判断输入值是否为正整数,如果不是,则调用 `callback` 函数并传递错误信息。如果输入值是正整数,则调用 `callback` 函数并传递一个空参数,表示校验通过。 然后,你可以在表单项中使用这个自定义校验器,并在 `rules` 属性中指定它: ```html <a-form-item label="正整数"> <a-input v-model:value="value" /> </a-form-item> ``` ```javascript { data() { return { value: '' } }, setup() { const { validatePositiveInteger } = yourValidateFunctions const rules = { value: [ { required: true, message: '请输入值' }, { validator: validatePositiveInteger, message: '请输入正整数' } ] } return { rules } } } ``` 在这个例子中,我们在 `rules` 属性中定义了一个校验规则,其中包括了一个非空校验规则和一个自定义校验规则。当表单项的值发生变化时,Ant Design Vue 会自动触发这些校验规则,然后根据校验结果来显示错误信息或者提交表单。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值