Магазин Redux не обновляется после диспетчеризации действия

Привет всем Я новичок в react и работаю над проектом последнюю неделю Я пытаюсь создать этот логин для django rest framework используя react и redux toolkit.

Как я понимаю, создатели действий в redux создают действия, которые затем передаются редукторам для изменения глобального состояния. Если это так, то почему мой создатель действия для входа в систему не сохраняет токены доступа и обновления в хранилище!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ниже приведен мой код.

--Login.js ---Здесь происходит большая часть логики входа в систему и используется создатель действия для входа.

import { useState } from "react"
import {useDispatch, useSelector} from "react-redux"
import {login} from '../features/auth/authSlice'
import axios from "axios"
const Login = () => {
    const userToken = useSelector((state)=>state.auth)
    const [username, setUsername] = useState('')
    const [password, setPassword] = useState('')
    const dispatch = useDispatch()
    

    const authenticate = async ()=>{
        // const resp = await axios.post('http://localhost:8000/auth/login', {formData})
        const resp = await fetch('http://localhost:8000/auth/login', {
            method: 'POST',
            headers:{
                'Content-Type': 'application/json'
            },
            body:JSON.stringify({username:username, password:password})
        })
        const data = await resp.json()
        console.log(data);
        dispatch(login({
            accessToken: data.access,
            refreshToken: data.refresh
        }))
        return data
        
    }
    

    const handleSubmit = (e) =>{
        e.preventDefault()
        console.log(username, password);
        // authenticate().then((data)=>{ }) 
        authenticate()
        setTimeout(()=>{
            console.log(userToken);
            
        }, 3000)
        console.log(userToken);
        
    }
    return ( 
        <div>
        <h1>Login</h1>
        <div className="Auth-form-container">
        <form className='Auth-form' onSubmit={handleSubmit}>
            <div className="Auth-form-content">
                <h2 className='Auth-form-title'>Login SSl Test</h2>
                <div className="form-group mt-3">
                    <label>Username</label>
                    <input
                    type="text"
                    className="form-control mt-1"
                    placeholder="Enter username"
                    value={username}
                    onChange={(e)=>setUsername(e.target.value)}
                    />
                </div>
                <div className="form-group mt-3">
                    <label>Password</label>
                    <input
                    type="password"
                    className="form-control mt-1"
                    placeholder="Enter password"
                    value={password}
                    onChange={(e)=>setPassword(e.target.value)}
                    />
                </div>
                <div className="d-grid gap-2 mt-3">
                    <button type="submit" className="btn btn-primary">
                    Submit
                    </button>
                </div>
            </div>
        </form>
    </div>
    </div>
    );
}
 
export default Login;

--AuthSlice.js ---Мой кусочек инструментария redux для аутентификации

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";

const initialState = {
    accessToken: null,
    refreshToken: null
}


const authSlice = createSlice({
    name:'auth',
    initialState,
    reducers:{
        login:(state, action)=>{            
            state.accessToken = action.payload.accessToken
            state.refreshToken = action.payload.refreshToken
        },
        logout:(state, action)=>{
            state.accessToken = ''
            state.refreshToken = ''
        }
    }
});

export const {login, logout} = authSlice.actions
export default authSlice.reducer

Заранее спасибо, я действительно бился головой об этот вопрос. Любая помощь приветствуется, но нам нужны реальные ответы, lol.

Я очень заблудился здесь, все выглядит хорошо для меня, просто не знаю, почему, когда я пытаюсь получить доступ к состоянию хранилища после входа в систему, токены не находятся там

Ваше состояние, вероятно, меняется. Проблема в том, как вы обращаетесь к userToken. Вы обращаетесь к устаревшей переменной закрытия - userToken из прошлого рендера. Если вы поместите console.log(userToken) в сам компонент, вы увидите, что компонент рендерится и что после этого рендеринга появляется новая переменная userToken, которая имеет правильное значение. Это просто старая переменная с прошлого рендера, с которой вы взаимодействуете, которая никогда не изменится.

Вернуться на верх