antd4 Form表单验证的错误信息用Tooltip展示

8 篇文章 0 订阅

    1、Tooltip属性

    autoAdjustOverflow={false}   // 气泡被遮挡时是否自动调整位置

    open={!!errorInfo1}  // 用于手动控制浮层显隐

   2、Form.Item属性

    help=''   // 设置这个不显示错误信息

    hidden   // 隐藏当前项不显示

  3、Form属性

   validateTrigger={['onChange']}  // 设置字段校验的时机

import React, { Component } from 'react'
import { Form, Input, Row, Col, Select, Button, Tooltip } from 'antd'
const { Option } = Select;
class FormAntd extends Component {
    constructor(props) {
        super(props)
        this.state = {
            errorInfo: '',
            errorInfo1: '',
            errorInfo2: '',
        }
    }

    formRef = React.createRef()

    onValuesChange = (changedValues, allValues) => {
        console.log('onValuesChange', changedValues, allValues);
    }
    onFinish = (value) => {  // 点击提交时,做最后的校验
        console.log('onFinish', value);
        // const form = this.formRef.current
        // form.validateFields().then((values) => {  // 如果全部字段通过校验,会走then方法,里面可以打印出表单所有字段(一个object)
        //     console.log('成功')
        //     console.log(values)
        // }).catch((errInfo) => {  // 如果有字段没听过校验,会走catch,里面可以打印所有校验失败的信息
        //     console.log('失败');
        //     console.log(errInfo);
        // })
    }
    onFinishFailed = ({ values, errorFields, outOfDate }) => {  // 点击提交时,做最后的校验
        console.log('onFinishFailed', values, errorFields, outOfDate);
    }

    render() {
        const layout = {
            labelCol: { span: 8 },
            wrapperCol: { span: 16 },
        }
        const { errorInfo, errorInfo1, errorInfo2 } = this.state;
        return (
            <div>
                <h3>表单校验-demo</h3>
                <Form ref={this.formRef}
                    {...layout}
                    onFinish={this.onFinish}
                    onFinishFailed={this.onFinishFailed}
                    onValuesChange={this.onValuesChange}
                    validateTrigger={['onChange']}
                    style={{ width: '600px', margin: '0 auto' }}
                >
                    <Row gutter={24}>
                        <Col span={24} key="select1">
                            <Tooltip placement="right" title={errorInfo1}
                                autoAdjustOverflow={false}
                                open={!!errorInfo1}>
                                <Form.Item label="下拉框1" name="select1" 
                                    rules={[{ required: true, message: '请输入用户名!' },
                                    ]}
                                >
                                    <Select
                                        mode="multiple"
                                        showSearch
                                        placeholder="下拉框1"
                                        // onChange={this.handleChangeSchool}
                                        style={{ width: '100%' }}
                                    >
                                        <Option key='1' value='11'>aa</Option>
                                        <Option key='2' value='22'>bb</Option>
                                        <Option key='3' value='33'>cc</Option>
                                    </Select>
                                </Form.Item>
                            </Tooltip>
                        </Col>
                        <Col span={24} key="text1">
                            <Tooltip placement="right" title={errorInfo2}
                                autoAdjustOverflow={false}
                                open={!!errorInfo2}>
                                <Form.Item label="密码" name="text1"
                                    // validateTrigger={['onBlur']}
                                    // validateTrigger={['onChange']}
                                    help=''   // 设置这个不显示错误信息
                                    // hidden   // 隐藏当前项不显示
                                    rules={[
                                        // { required: true, message: '请输入密码!' },
                                        // { min: 6, message: '密码至少6位!' },
                                        // { max: 10, message: '密码最长10位!' },
                                        {
                                            validator: (_, value) => {
                                                if (!value) {
                                                    this.setState({
                                                        errorInfo2: '请输入密码!'
                                                    });
                                                    return Promise.reject('请输入密码!')
                                                } else if (value && (value.length < 6 || value.length > 10)) {
                                                    this.setState({
                                                        errorInfo2: 'text1必须是6~10位'
                                                    });
                                                    return Promise.reject('text1必须是6~10位')
                                                } else {
                                                    this.setState({
                                                        errorInfo2: ''
                                                    });
                                                    return Promise.resolve()
                                                }
                                            }
                                        }
                                    ]}
                                >
                                    <Input placeholder="text1" />
                                </Form.Item>
                            </Tooltip>
                        </Col>
                        <Col span={24} key="text2">
                            <Tooltip placement="right" title={errorInfo}
                                autoAdjustOverflow={false}
                                open={!!errorInfo}>
                                <Form.Item label="确认密码" name="text2"
                                    // validateTrigger="onfocus"
                                    // validateTrigger={['onChange']}
                                    // hidden
                                    help=''
                                    rules={[
                                        {
                                            validator: (_, value) => {
                                                const form = this.formRef.current
                                                let text1 = form.getFieldValue('text1')
                                                if (value && (value.length < 6 || value.length > 10)) {
                                                    this.setState({
                                                        errorInfo: 'text1必须是6~10位'
                                                    });
                                                    return Promise.reject('text1必须是6~10位')
                                                } else if (text1 !== value) {
                                                    this.setState({
                                                        errorInfo: '两次密码不一致'
                                                    });
                                                    return Promise.reject(new Error('两次密码不一致'))
                                                } else {
                                                    this.setState({
                                                        errorInfo: ''
                                                    });
                                                    return Promise.resolve()
                                                }
                                            }
                                        }
                                    ]}
                                >
                                    <Input placeholder="text2" />
                                </Form.Item>
                            </Tooltip>
                        </Col>
                        <Col span={24} key="text3">
                            <Form.Item label="文本框3" name="text3"
                                tooltip={{
                                    title: (
                                        '我是浮动提示内容'
                                    ),
                                    color: 'red',
                                    placement: 'rightTop',
                                }}
                            >
                                <Input type="number" placeholder="text3" />
                            </Form.Item>
                        </Col>
                    </Row>
                    <Row>
                        <Col span={24} style={{ textAlign: 'right' }}>
                            <Button type="primary" htmlType='submit' style={{ marginRight: '8px' }}>提交</Button>
                        </Col>
                    </Row>
                </Form>
            </div>
        )
    }
}


export default FormAntd;

在 Ant Design 的 Form 表单中,可以使用 `getFieldError` 方法来获取某个表单字段的校验错误信息,或者使用 `isFieldTouched` 方法来判断某个表单字段是否被触摸过。这样你就可以单独验证某个值了。 下面是一个示例代码,演示了如何单独验证某个表单字段的值: ```javascript import { Form, Input, Button } from 'antd'; const MyForm = () => { const [form] = Form.useForm(); const onFinish = (values) => { console.log('Form values:', values); }; const validateValue = () => { form.validateFields(['fieldName']).then(() => { // 验证成功 console.log('Validation passed'); }).catch(() => { // 验证失败 console.log('Validation failed'); }); }; return ( <Form form={form} onFinish={onFinish}> <Form.Item name="fieldName" rules={[ { required: true, message: 'Please enter a value' }, // 可以添加其他的校验规则 ]} > <Input placeholder="Enter a value" /> </Form.Item> <Button type="primary" htmlType="submit"> Submit </Button> <Button onClick={validateValue}> Validate Value </Button> </Form> ); }; export default MyForm; ``` 在上面的示例中,我们创建了一个名为 `MyForm` 的函数组件。在组件中,我们使用 `Form.useForm()` 来创建一个表单实例,并通过 `form` 属性将其与 `<Form>` 组件进行绑定。 在 `<Form.Item>` 组件中,我们定义了一个名为 `fieldName` 的表单字段,同时为它添加了一些校验规则。例如,我们要求该字段是必填的,并且在没有输入值的情况下会显示一个错误提示信息。 在 `validateValue` 函数中,我们调用了 `form.validateFields(['fieldName'])` 方法来单独验证 `fieldName` 字段的值。如果验证通过,则会执行 `then` 回调函数;如果验证失败,则会执行 `catch` 回调函数。你可以根据需要在这两个回调函数中进行相应的处理逻辑。 最后,在 `<Button>` 组件中,我们分别设置了一个提交按钮和一个用于单独验证字段值的按钮。当用户点击这两个按钮时,分别会触发相应的事件。 希望这个示例能帮助到你!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值