#javascript #reactjs #redux #navbar
#javascript #reactjs #redux #панель навигации
Вопрос:
Я разрабатываю свой проект с помощью reactjs и redux, и поэтому я хочу показывать разные ссылки в панели навигации при входе в систему или выходе из системы. Когда я нажимаю на Login, все в порядке, и все работает правильно, но когда я нажимаю на Logout, это автоматически не меняет панель навигации, и мне нужно обновить страницу. Может ли мне помочь какой-либо орган? Вот мой Navbar.js:
import React, { useEffect, useState} from 'react'
import { useDispatch, useSelector } from 'react-redux';
import { Link,useHistory } from 'react-router-dom';
import { selectAccessToken } from '../features/authentications/authenticationsSlice';
import axios from 'axios';
import './Navbar.css';
export const Navbar = (props) => {
const [loggedIn , setLoggedIn] = useState(false)
let accessToken = useSelector(selectAccessToken);
const [token, setToken] = useState(accessToken)
const dispatch = useDispatch()
const [loggedOut, setLoggedOut] = useState([]);
const [errors, setErrors] = useState([]);
const LOGOUT_URL = 'http://127.0.0.1:8000/accounts_api/v1/dj-rest-auth/logout/';
const history = useHistory()
const removeTokens = async () => {
try {
const response = await axios.post(`${LOGOUT_URL}`, { headers: { "Authorization": `Bearer ${accessToken}` }})
const data = response.data;
setLoggedOut(data)
console.log("data: ", data)
}
catch (err) {
console.log('err', err)
setErrors(err)
}
}
const handleLogout = async () => {
await logout();
history.push("login/");
};
const logout = () => {
removeTokens()
localStorage.removeItem("access_token")
localStorage.removeItem("refresh_token")
console.log('localstrorage token after logout: ', localStorage.getItem("access_token"))
setLoggedIn(false);
accessToken = null
console.log('accesstoken after logout:', accessToken)
}
if (accessToken) {
return (
<nav>
<ul className="menu">
<li className="logo"> My logo </li>
<li className="item">
<Link to="/">
articles
</Link>
</li>
<li>
<Link to="/topics">Topics</Link>
</li>
<li>
<Link to="/articles">Seconds</Link>
</li>
<li className="item">
<Link to="/management">
management
</Link>
</li>
<li className="item">
<Link to="/" onClick={handleLogout}>
Logout
</Link>
</li>
</ul>
</nav>
)
} else if (!accessToken) {
return (
<nav>
<ul className="menu">
<li className="logo"> My logo </li>
<li className="item">
<Link to="/">
articles
</Link>
</li>
<li>
<Link to="/topics">Topics</Link>
</li>
<li>
<Link to="/articles">Seconds</Link>
</li>
<li className="item">
<Link
to="/login"
onClick={() => {
localStorage.setItem("access_token", true);
setLoggedIn(true);
}
}
>
Login
</Link>
</li>
</ul>
</nav>
)
}
}
Ответ №1:
Вы не можете установить для accessToken значение null, подобное этому, при выходе из системы. Этот accessToken является ссылкой на ваш токен доступа в вашем состоянии redux. Ваше состояние redux по-прежнему содержит токен доступа.
accessToken = null
Вы должны создать action
put accessToken как null из redux.
А затем вызовите функцию при выходе из системы.
Комментарии:
1. Я знаю, но проблема не в этом. потому что после изменения accessToken он не меняет панель навигации так, как я хочу
2. Вы создали действие и обновили свое состояние до redux и установили для него значение
null
?3. Спасибо за вашу помощь. Во-первых, я не понял, что вы сказали, теперь это решено!