【问题标题】:Changing Navbar links after logging out in reactjs在 reactjs 中注销后更改导航栏链接
【发布时间】:2020-09-26 07:31:10
【问题描述】:

我正在使用 reactjs 和 redux 开发我的项目,我想在登录或注销时在导航栏中显示不同的链接。因此,当我单击登录时,一切正常,但当我单击注销时,它不会自动更改导航栏,我必须刷新页面。有谁能够帮助我? 这是我的 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>
     )
   }
   
}



【问题讨论】:

    标签: javascript reactjs redux navbar


    【解决方案1】:

    您不能在注销时像这样将 accessToken 设置为 null。 这个 accessToken 是你在 redux 状态下的访问令牌的引用。你的 redux 状态仍然包含访问令牌。

    accessToken = null
    

    您必须从 redux 创建 action 并将 accessToken 设置为 null。 然后在注销时调用该函数。

    【讨论】:

    • 我知道,但问题不在于。因为在更改 accessToken 后,它不会像我想要的那样更改导航栏
    • 您是否创建了一个操作并将您的状态更新为 redux 并将其设置为 null
    • 感谢您的帮助。一开始我没看懂你说的,现在解决了!
    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2018-01-26
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多