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

ReactJS中如何根据接口响应显示注册结果提示弹窗?

解决注册成功/失败弹窗始终显示的问题

核心是用React状态控制弹窗的显示与隐藏,根据接口请求的成功或失败结果动态渲染对应提示,无需跳转页面。以下是具体修改方案:

步骤1:添加状态管理

导入useState并新增状态变量,用来记录注册结果:

import { useState } from 'react'; // 别忘了导入useState

function Register(props) {
    const navigate = useNavigate();
    // 状态说明:null=不显示弹窗,'success'=显示成功提示,'error'=显示失败提示
    const [registerStatus, setRegisterStatus] = useState(null);
    
    // ... 原有的input状态逻辑保持不变

步骤2:调整提交处理逻辑

把表单验证移到请求发起前,避免无效请求;根据接口响应结果更新注册状态:

const submitHandler = async event => {
    event.preventDefault();

    // 先验证表单有效性,无效直接终止流程
    if (!formIsValid) return;

    const registerInput = {
        username: usernameValue,
        email: emailValue,
        password: passwordValue
    };

    try {
        await axios.post("/api/auth/register", registerInput);
        // 请求成功:设置成功状态,重置表单(如需跳转可取消navigate注释)
        setRegisterStatus('success');
        resetEmail();
        resetUsername();
        resetPassword();
        // navigate('/'); // 如需跳转首页请取消注释
    } catch (error) {
        console.log(error.response?.data);
        // 请求失败:设置错误状态
        setRegisterStatus('error');
    }
};

步骤3:条件渲染弹窗并添加关闭功能

移除始终显示的Alert组件,改为根据registerStatus的值动态渲染对应弹窗,同时添加关闭按钮:

return (
    <div className='centered'>
        <form onSubmit={submitHandler} className='register-box'>
            {/* ... 原有的表单内容保持不变 */}

            <Button disabled={!formIsValid} variant="primary" type='submit'>
                Create New Account
            </Button>

            <br/><br/>

            {/* 成功提示弹窗 */}
            {registerStatus === 'success' && (
                <Alert variant="success" onClose={() => setRegisterStatus(null)} dismissible>
                    Account creation was successful.
                </Alert>
            )}
            
            {/* 失败提示弹窗 */}
            {registerStatus === 'error' && (
                <Alert variant="danger" onClose={() => setRegisterStatus(null)} dismissible>
                    Account creation has failed.
                </Alert>
            )}
        </form>
    </div>
);

额外修复:移除无效点击事件

原代码中Button的onClick={alertClicked}是未定义函数,直接删除即可,表单提交由form的onSubmit事件处理。

完整修改后的代码

import { useState, useNavigate } from 'react';
import axios from 'axios';
import Button from 'react-bootstrap/Button';
import Alert from 'react-bootstrap/Alert';
import useInput from './useInput'; // 路径根据实际项目调整

const isNotEmpty = (value) => value.trim() !== '';
const isEmail = (value) => value.includes('@');

function Register(props) {
    const navigate = useNavigate();
    const [registerStatus, setRegisterStatus] = useState(null);

    // username input
    const {
        value: usernameValue,
        isValid: usernameIsValid,
        hasError: usernameHasError,
        valueChangeHandler: usernameChangeHandler,
        inputBlurHandler: usernameBlurHandler,
        reset: resetUsername
    } = useInput(isNotEmpty);

    // password input
    const {
        value: passwordValue,
        isValid: passwordIsValid,
        hasError: passwordHasError,
        valueChangeHandler: passwordChangeHandler,
        inputBlurHandler: passwordBlurHandler,
        reset: resetPassword
    } = useInput(isNotEmpty);

    // email input
    const {
        value: emailValue,
        isValid: emailIsValid,
        hasError: emailHasError,
        valueChangeHandler: emailChangeHandler,
        inputBlurHandler: emailBlurHandler,
        reset: resetEmail
    } = useInput(isEmail);

    let formIsValid = false;
    if (usernameIsValid && emailIsValid && passwordIsValid) {
        formIsValid = true;
    }

    const submitHandler = async event => {
        event.preventDefault();

        if (!formIsValid) return;

        const registerInput = {
            username: usernameValue,
            email: emailValue,
            password: passwordValue
        };

        try {
            await axios.post("/api/auth/register", registerInput);
            setRegisterStatus('success');
            resetEmail();
            resetUsername();
            resetPassword();
            // navigate('/'); // 如需跳转首页请取消注释
        } catch (error) {
            console.log(error.response?.data);
            setRegisterStatus('error');
        }
    };

    const emailClasses = emailHasError ? 'form-control invalid' : 'form-control';
    const usernameClasses = usernameHasError ? 'form-control invalid' : 'form-control';
    const passwordClasses = passwordHasError ? 'form-control invalid' : 'form-control';

    return (
        <div className='centered'>
            <form onSubmit={submitHandler} className='register-box'>
                <h3 className="register-title">Create New Account</h3>
                <div className='control-group'>
                    <div className={emailClasses}>
                        <input required
                            type="email"
                            name="email"
                            value={emailValue}
                            placeholder='Email'
                            onChange={emailChangeHandler}
                            onBlur={emailBlurHandler}
                        />
                        {emailHasError && <p className="error-text">Please provide a valid Email</p>}
                    </div>
                    <div className={usernameClasses}>
                        <input required
                            type="text"
                            name="username"
                            value={usernameValue}
                            placeholder='Login ID'
                            onChange={usernameChangeHandler}
                            onBlur={usernameBlurHandler}
                        />
                        {usernameHasError && <p className="error-text">Please enter your future Login ID</p>}
                    </div>
                    <div className={passwordClasses}>
                        <input required
                            type="password"
                            name="password"
                            value={passwordValue}
                            placeholder='Password'
                            onChange={passwordChangeHandler}
                            onBlur={passwordBlurHandler}
                        />
                        {passwordHasError && <p className="error-text">Please enter your future Password</p>}
                    </div>
                </div>

                <Button disabled={!formIsValid} variant="primary" type='submit'>
                    Create New Account
                </Button>

                <br/><br/>

                {registerStatus === 'success' && (
                    <Alert variant="success" onClose={() => setRegisterStatus(null)} dismissible>
                        Account creation was successful.
                    </Alert>
                )}

                {registerStatus === 'error' && (
                    <Alert variant="danger" onClose={() => setRegisterStatus(null)} dismissible>
                        Account creation has failed.
                    </Alert>
                )}

            </form>
        </div>
    );
}

export default Register;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:05:22