You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React+Antd注册表单中展示后端返回的自定义错误

问题描述

使用React + Ant Design实现注册功能,当后端返回如下格式的“用户已注册”错误时,需要点击Sign Up按钮后在表单的用户名输入框下方展示该错误提示。

后端错误返回示例:

{
    "errorCode": "1",
    "errorMessage": "user already registered"
}

现有注册页面代码:

class RegisterPage extends React.Component {

    // Method in which I send the request
    signUp(values) {
        fetch("http://localhost:8080/sign-up", {
            method: "POST",
            body: JSON.stringify({"username": values.username, "password": values.password})
        }).then(response => response.json())
            .then(response => {console.log(response)
            })
    }

    render() {
        return (
            <>
                <Header/>
                <div className="container">
                </div>
                <Row type="flex" justify="center" align="middle" style={{minHeight: '80vh'}}>
                    <Form

                        name="normal_login"
                        className="login-form"
                        initialValues={{
                            remember: true,
                        }}
                        onFinish={this.signUp}
                    >
                        <Form.Item className="username-input"
                                   name="username"
                                   rules={[
                                       {
                                           required: true,
                                           message: 'This user already registered!',
                                       }
                                   ]}
                        >
                            <Input prefix={<UserOutlined className="site-form-item-icon"/>} placeholder="Username"/>
                        </Form.Item>
                        <Form.Item
                            name="password"
                            rules={[
                                {
                                    required: true,
                                    message: 'Please input your password!',
                                    min: 1,
                                },
                            ]}
                        >
                            <Input
                                prefix={<LockOutlined className="site-form-item-icon"/>}
                                type="password"
                                placeholder="Password"
                            />
                        </Form.Item>
                        <Form.Item
                            name="confirm_password"
                            rules={[
                                {
                                    required: true,
                                    message: 'Please confirm your password!',
                                },
                                ({getFieldValue}) => ({
                                    validator(_, value) {
                                        if (!value || getFieldValue('password') === value) {
                                            return Promise.resolve();
                                        }
                                        return Promise.reject(new Error('Passwords don\'t match!'));
                                    },
                                }),
                            ]}
                        >
                            <Input
                                prefix={<LockOutlined className="site-form-item-icon"/>}
                                type="password"
                                placeholder="Confirm password"
                            />
                        </Form.Item>
                        <Form.Item>
                            <Button type="primary" htmlType="submit" className="login-form-button"
                                    style={{width: "100%"}}>
                                Sign Up
                            </Button>
                        </Form.Item>
                    </Form>
                </Row>
                <PageFooter/>
            </>
        )
    }
}
解决方案

核心是利用Ant Design Form组件的setFields方法手动设置字段错误状态,具体实现步骤如下:

1. 给Form组件添加Ref引用

要调用Form的内置方法,首先需要获取Form实例,在类组件中通过createRef实现:

class RegisterPage extends React.Component {
    // 创建Form的ref引用
    formRef = React.createRef();

    // ... 其他代码
}

然后在render的Form组件上绑定该ref:

<Form
    ref={this.formRef}
    name="normal_login"
    className="login-form"
    initialValues={{
        remember: true,
    }}
    onFinish={this.signUp}
>

2. 修改signUp方法处理后端错误

在请求回调中判断后端返回的错误信息,触发setFields给username字段设置错误提示:

signUp(values) {
    fetch("http://localhost:8080/sign-up", {
        method: "POST",
        headers: { // 添加Content-Type头,确保后端正确解析JSON
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({"username": values.username, "password": values.password})
    })
    .then(response => response.json())
    .then(response => {
        // 判断是否为用户已注册的错误
        if (response.errorCode === "1" && response.errorMessage === "user already registered") {
            // 给username字段设置错误提示
            this.formRef.current.setFields([
                {
                    name: 'username',
                    errors: [response.errorMessage],
                }
            ]);
        } else {
            // 处理注册成功逻辑,比如跳转登录页
            console.log("注册成功", response);
        }
    })
    .catch(error => {
        // 处理网络请求失败情况
        console.error("请求失败", error);
    });
}

3. 调整用户名字段校验规则(可选)

原代码中用户名的必填提示与后端错误提示重复,建议修改为合理的必填提示:

<Form.Item className="username-input"
           name="username"
           rules={[
               {
                   required: true,
                   message: '请输入用户名!', // 修改为必填提示
               }
           ]}
>

内容的提问来源于stack exchange,提问作者Golov Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:33:32