У меня есть регистрация учетной записи на веб-сайте, и я хочу, чтобы на странице отображалось оповещение в зависимости от успешного или неудачного создания учетной записи.
Вот текущий код, который у меня есть (у меня постоянно отображаются оповещения)
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
Я уже задавал аналогичный вопрос раньше, и хотя я получил ответ, который временно решил проблему (а именно создание двух страниц и перенаправление пользователей на каждую страницу в зависимости от результата регистрации), это не совсем то, что мне хотелось бы. иметь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Есть несколько способов добиться этого. Вы можете добавить тайм-аут перед переходом на домашнюю страницу и показывать оповещение на основе ответа 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 />
------
Спасибо! Это не предупреждение, но оно прекрасно работает и во всплывающих окнах!
Ваш сервер отвечает на эти POST-запросы правильным кодом состояния и дополнительным сообщением для передачи. Если регистрация сработала, передайте код состояния 200 и имя пользователя учетной записи, которое будет отображаться где-нибудь в вашем HTML. Если регистрация не удалась, вы можете отправить код состояния, например 400, и предоставить подробную информацию для отображения на странице клиента. Console.log ниже вашего axios.post. res.status и res.data для ответа сервера.