Начальное состояние в react redux обновляется после жесткого обновления вместо нажатия кнопки
Я пытаюсь создать страницу входа, которая использует простой JWT из django rest framework для аутентификации и react js в качестве фронтенда и redux для управления состоянием. Я храню информацию о пользователе в локальном хранилище и начальное состояние обновляется из локального хранилища. Я хочу обновлять начальное состояние при нажатии на кнопку, но оно обновляется только после жесткого обновления. Все используемые файлы приведены ниже:
UserReducer.js
import axios from 'axios'
import {
USER_LOGIN_SUCCESS ,
USER_LOGIN_REQUEST ,
USER_LOGIN_FAIL ,
USER_LOGOUT ,
} from '../constants/userConstants'
export const login = (email , password ) => async(dispatch) => {
try{
dispatch({
type: USER_LOGIN_REQUEST })
const sdata = {
headers: {
'Content-type': 'application/json'
}
}
const {data} = await axios.post('/api/users/login/' ,
{ 'username': email , 'password': password} , sdata
)
localStorage.setItem('userInfo' , JSON.stringify(data))
dispatch({
type:USER_LOGIN_SUCCESS ,
payload:data
})
dispatch({
type: USER_LOGOUT,
payload: {}
})
}catch(error){
dispatch({
type: USER_LOGIN_FAIL,
payload: error.response && error.response.data.detail
? error.response.data.detail
: error.message,
})
}
}
Store.js
import {createStore , combineReducers , applyMiddleware} from 'redux'
import thunk from 'redux-thunk'
import {composeWithDevTools} from 'redux-devtools-extension'
import {productListReducer} from './reducers/productReducers'
import { productDetailsReducer } from './reducers/productReducers'
import { cartItemReducer} from './reducers/cartReducers'
import { userLoginReducer } from './reducers/userReducers'
const reducer = combineReducers({
productList: productListReducer,
productDetails : productDetailsReducer,
cart: cartItemReducer ,
loginuser: userLoginReducer,
})
const cartItemsInStorage = localStorage.getItem('cartItems') ?
JSON.parse(localStorage.getItem('cartItems')): []
const userInfoInStorage = localStorage.getItem('userInfo') ?
JSON.parse(localStorage.getItem('userInfo')): null
const initialState = {
cart: {cartItems: cartItemsInStorage} ,
loginuser: {userInfo: userInfoInStorage}
}
const middleware = [thunk]
const store = createStore
(reducer , initialState , composeWithDevTools(applyMiddleware(...middleware)))
export default store
userAction.js
import axios from 'axios'
import {
USER_LOGIN_SUCCESS ,
USER_LOGIN_REQUEST ,
USER_LOGIN_FAIL ,
USER_LOGOUT ,
} from '../constants/userConstants'
export const login = (email , password ) => async(dispatch) => {
try{
dispatch({
type: USER_LOGIN_REQUEST })
const sdata = {
headers: {
'Content-type': 'application/json'
}
}
const {data} = await axios.post('/api/users/login/' ,
{ 'username': email , 'password': password} , sdata
)
localStorage.setItem('userInfo' , JSON.stringify(data))
dispatch({
type:USER_LOGIN_SUCCESS ,
payload:data
})
dispatch({
type: USER_LOGOUT,
payload: {}
})
}catch(error){
dispatch({
type: USER_LOGIN_FAIL,
payload: error.response && error.response.data.detail
? error.response.data.detail
: error.message,
})
}
}
Loginpage.js
import React, { useEffect , useState } from "react";
import FormContainer from "../components/Form"
import { useDispatch, useSelector } from "react-redux";
import {Link , useNavigate } from 'react-router-dom'
import { login } from "../actions/userAction";
import Loader from '../components/Loader'
import Message from '../components/Message'
function LoginPage() {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const navigate = useNavigate()
const dispatch = useDispatch()
const loginuser = useSelector(state => state.loginuser)
const {error , loading , userInfo} = loginuser
console.log("userinfo: " , userInfo)
const handleSubmit = (e) => {
e.preventDefault()
dispatch(login(email , password))
}
useEffect(() => {
if(userInfo){
navigate('/')
}
})
return (
<>
<FormContainer>
{error && <Message error = {error} />}
{loading && <Loader />}
<center>
<h3 className="my-4">Login</h3>
</center>
<form onSubmit={handleSubmit}>
Email:{" "}
<input
type="text"
placeholder="Enter Your email"
className="form-control"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
password:{" "}
<input
type="password"
placeholder="Enter your password"
className="form-control"
value = {password}
onChange={(e) => setPassword(e.target.value)}
/>
<center>
<input
type="submit"
value="Login"
className="btn btn-warning my-5"
/>
</center>
</form>
<div className="row my-3">
<div className="col">
New Customer? <Link to = '/register' > Register</Link>
</div>
</div>
</FormContainer>
</>
);
}
export default LoginPage;