简体   繁体   English

提交表单时显示警报错误

[英]display alert errors when form is submitted

I'm trying to display alert if the user submit bad email and password, but I'm struggling with this.如果用户提交错误的电子邮件和密码,我会尝试显示警报,但我正在努力解决这个问题。 the errors and load states are updated when dispatch (login(user)) is executed.执行 dispatch (login(user)) 时会更新错误和加载状态。 but When the user click on login to submit the form the errors and loading aren't checked and directly navigate to the home page ('/').但是当用户单击登录以提交表单时,不会检查错误和加载并直接导航到主页('/')。

this is my login screen code :这是我的登录屏幕代码:

import React, { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { Alert, Button, Form, Spinner } from "react-bootstrap";
import { useNavigate } from "react-router-dom";
import { login } from "../JS/Action/user";



const Login = () => {
const [User, setUser] = useState({});
const errors = useSelector((state) => state.userReducer.errors);
const loading = useSelector((state) => state.userReducer.loadUser);
const dispatch = useDispatch();
const navigate = useNavigate();


const handleChnage = (e) => {
setUser({ ...User, [e.target.name]: e.target.value });
};
const handleUser = (e) => {
e.preventDefault();
dispatch(login(User))
navigate('/')

};
return (
 <div

>
  {errors && errors.map(el=><Alert variant="danger">{el.msg}</Alert>)}
  {loading && <Spinner animation="border" variant="secondary" />}

 <Form >
 
  
    <Form.Label>Email address</Form.Label>
    <Form.Control type="email" placeholder="Enter email" name="email" onChange={handleChnage} />

    <Form.Label>Password</Form.Label>
    <Form.Control type="text" placeholder="Password" name="password" onChange={handleChnage} />

    <Button variant="primary" type="submit" disabled={loading} onClick={handleUser} >
      login
    </Button>
  </Form>
</div>
);
};

export default Login;

this is the login Action :这是登录操作:

//LOGIN USER
   export const login = (user) => async (dispatch) => {
  dispatch({ type: LOAD_USER });
  try {
    let result = await axios.post("/api/user/login", user);
    dispatch({ type: LOGIN_USER, payload: result.data });
    
  } catch (error) {
    dispatch({ type: FAIL_USER, payload: error.response.data.errors });
  }
  };

and this is the user reducer :这是用户减速器:

  //import

import {
  CLEAR_ERRORS,
  CURRENT_USER,
  FAIL_USER,
  LOAD_USER,
  LOGIN_USER,
  LOGOUT_USER,
  REGISTER_USER,
} from "../ActionTypes/user";

//initial state
const initialState = {
  user: null,
  loadUser: false,
  errors: null,
  isAuth: false,
  isAdmin: false
};

//pure function
const userReducer = (state = initialState, { type, payload }) => {
  switch (type) {
    case LOAD_USER:
      return { ...state, loadUser: true };
    case REGISTER_USER:
      localStorage.setItem("token", payload.token);
      return {
        ...state,
        user: payload.user,
        loadUser: false,
        isAuth: true,
        isAdmin: payload.user.isAdmin,
      };
    case LOGIN_USER:
      localStorage.setItem("token", payload.token);
      return {
        ...state,
        loadUser: false,
        isAuth: true,
        user: payload.user,
        isAdmin: payload.user.isAdmin,
      };
    case CURRENT_USER:
      return {
        ...state,
        loadUser: false,
        isAuth: true,
        user: payload,
        isAdmin: payload.isAdmin,
      };
    case LOGOUT_USER:
      localStorage.removeItem("token");
      return {
        user: null,
        loadUser: false,
        errors: null,
        isAuth: false,
        isAdmin: false
      };
    case FAIL_USER:
      return { ...state, errors:payload, loadUser: false };
    case CLEAR_ERRORS:
      return { ...state, errors:null };
    default:
      return state;
  }
};

//export
export default userReducer;

sorry for my bad englih guys hope you got the idea and you can help me..对不起,我的坏人希望你能明白,你可以帮助我..

You don't have to use navigate("/") in the handleUser function as it will not check whether the user is logged in or not but will navigate.您不必在handleUser函数中使用navigate("/") ,因为它不会检查用户是否登录,而是会导航。

const handleUser = (e) => {
    e.preventDefault();
    dispatch(login(User))
    // navigate('/')
};

Instead, use useEffect hook to check whether the user is logged in or not and alert and navigate.

const user = useSelector((state) => state.userReducer.user);
const error = useSelector((state) => state.userReducer.errors);

useEffect(()=>{
    if(user){
        alert("Logged in successfully")
        navigate("/")
   }

    if(error){
        alert(error)
   }

},[navigate,user,error])

Hope it helps, Thanks.希望对您有所帮助,谢谢。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM