簡體   English   中英

提交表單時顯示警報錯誤

[英]display alert errors when form is submitted

如果用戶提交錯誤的電子郵件和密碼,我會嘗試顯示警報,但我正在努力解決這個問題。 執行 dispatch (login(user)) 時會更新錯誤和加載狀態。 但是當用戶單擊登錄以提交表單時,不會檢查錯誤和加載並直接導航到主頁('/')。

這是我的登錄屏幕代碼:

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;

這是登錄操作:

//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 });
  }
  };

這是用戶減速器:

  //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;

對不起,我的壞人希望你能明白,你可以幫助我..

您不必在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])

希望對您有所幫助,謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM