Как показать предупреждение на основе ответа консоли? РеактJS

У меня есть регистрация учетной записи на веб-сайте, и я хочу, чтобы на странице отображалось оповещение в зависимости от успешного или неудачного создания учетной записи.

Вот текущий код, который у меня есть (у меня постоянно отображаются оповещения)

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

function Register(props) {
    const navigate = useNavigate()

    //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()

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

        try {
            const res = await axios.post("/api/auth/register", registerInput)
            console.info(registerInput)
        } catch (error) {
            console.info(error.response?.data)
        }

        if (!formIsValid) return

        resetEmail()
        resetUsername()
        resetPassword()
        navigate()



    }


    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}
                    onClick = {alertClicked}
                    variant = "primary"
                    type='submit'>
                    Create New Account
                </Button>

                <br></br>
                <br></br>

                <Alert variant = "success">Account ceation was successful.</Alert>
                <Alert variant = "danger">Account creation has failed.</Alert>

            </form>
        </div>
    )
}

export default Register

Я уже задавал аналогичный вопрос раньше, и хотя я получил ответ, который временно решил проблему (а именно создание двух страниц и перенаправление пользователей на каждую страницу в зависимости от результата регистрации), это не совсем то, что мне хотелось бы. иметь.

Ваш сервер отвечает на эти POST-запросы правильным кодом состояния и дополнительным сообщением для передачи. Если регистрация сработала, передайте код состояния 200 и имя пользователя учетной записи, которое будет отображаться где-нибудь в вашем HTML. Если регистрация не удалась, вы можете отправить код состояния, например 400, и предоставить подробную информацию для отображения на странице клиента. Console.log ниже вашего axios.post. res.status и res.data для ответа сервера.

BGPHiJACK 16.04.2024 18:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть несколько способов добиться этого. Вы можете добавить тайм-аут перед переходом на домашнюю страницу и показывать оповещение на основе ответа API, но это будет не очень удобно для пользователя.

Вместо этого вы можете использовать библиотеку response-toastify, чтобы более элегантно отображать сообщение об успехе/ошибке, не позволяя пользователю ждать. React-toastify будет отображать сообщение на экране, даже если вы перенаправляетесь на другую страницу. Вот логика: вы можете настроить всплывающее окно в соответствии с вашими требованиями.

Определите новую функцию:

const showToast = (type, message) => {
      if (type === "success") {
        toast.success(message, {
          position: "bottom-right",
          autoClose: 2000,
          hideProgressBar: false,
          closeOnClick: false,
          pauseOnHover: false,
          draggable: false,
        });
      } else {
        toast.error(message, {
          position: "bottom-right",
          autoClose: 2000,
          hideProgressBar: false,
          closeOnClick: false,
          pauseOnHover: false,
          draggable: false,
        });
      }
    };

try {
  const res = await axios.post("/api/auth/register", registerInput)
  if (res.status === 200)
    showToast("success", "Registration successful");
  else
    showToast("error", "There seems to be an Error during registration");        
  } catch (error) {
    showToast("error", error.response?.data || "There seems to be an Error during registration");        
  }

P.S. Добавьте <ToastContainer /> в JSX вверху.

return (
        <div className='centered'>
        <ToastContainer />
------

Спасибо! Это не предупреждение, но оно прекрасно работает и во всплывающих окнах!

enimox 17.04.2024 13:39

Другие вопросы по теме