登录后如何从导航栏中删除登录按钮

Posted

技术标签:

【中文标题】登录后如何从导航栏中删除登录按钮【英文标题】:How to remove Login button from nav bar after logging in 【发布时间】:2020-08-23 08:42:11 【问题描述】:

我正在构建一个具有 3 个不同页面(主页、登录和用户)的网站,并且我正在使用 React Router 中的 Switch 组件在页面之间移动。 我遇到的问题是当我到达用户页面时,我仍然在导航列表中看到登录,如下图所示 现在,我希望在进入用户页面或将文本切换为“注销”后删除登录按钮。你对如何做到这一点有什么建议吗?我还包括了代码,所以它更清晰

标题(导航栏)组件

import React from "react";
import  Link  from "react-router-dom";
import './App.css';

const Header = () => (
  <header >
    <nav className='topnav'>
      <ul>
          <li>
            <Link to="/Login">Login</Link>
          </li>
          <li>
            <Link to="/">Home</Link>
          </li>

      </ul>
    </nav>
  </header>
);

export default Header;

登录组件

const Login = () => (

  <Switch>
    <div className="LoginWrap">
      <Route exact path="/Login" component=LoginForm />
      <Route path="/Login/:number" component=User />
    </div>
  </Switch>

);

export default Login;

用户组件是here。


编辑:根据您的建议,我尝试这样做:

<Link to="/Login">

  console.log("Header localStorage.getItem isLoggedIn is :" + localStorage.getItem("isLoggedIn"))


  localStorage.getItem("isLoggedIn") === true? "Logout" : "Login"

</Link>

但是,它一直显示“登录”。

我不知道为什么。即使在控制台中,当您通过登录表单登录然后按下标题上的链接按钮时,它也会正确打印“Header localStorage.getItem isLoggedIn is :true”和“Header localStorage.getItem isLoggedIn is :false”


更奇怪的是当我把代码改成

localStorage.getItem("isLoggedIn") ? "Logout" : "Login"

,它总是显示“注销”

【问题讨论】:

我建议您使用 State 而不是 localStorage 来管理身份验证。 @Devang 你的意思是使用像 Redux 这样的工具的全局状态?您是否知道为什么当我删除===true 时它有时会显示登录而有时会显示注销? 不需要使用 Redux。只需更新登录成功的状态。 【参考方案1】:

如果您想使用 Redux 解决您的问题,可以查看我在我的 github 存储库 (https://github.com/saamerm/ReactAndRedux-CounterApp) 中的简单 redux 示例,它将能够详细解释所有内容。

您只需为您的应用程序更改 index.js 和 Counter.js(在您的情况下为登录)文件:

    Index.js
import React from "react";
import  render  from "react-dom";
import  BrowserRouter  from "react-router-dom";
import App from "./components/App";
import  Provider  from "react-redux";
import  createStore  from "redux";

const initialState = 
  isLoggedIn: false
;

function reducer(state = initialState, action) 
  switch (action.type) 
    case "LOGIN":
      return 
        isLoggedIn: true
      ;
    case "LOGOUT":
      return 
        isLoggedIn: false
      ;
    default:
      return state;
  


const store = createStore(reducer);

render(
  <Provider store=store>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </Provider>,
  document.getElementById("root")
);

    登录组件
import React from "react";
import  connect  from "react-redux";

class Login extends React.Component 
    login = () => 
        this.props.dispatch( type: "LOGIN" );
    ;
    logout = () => 
        this.props.dispatch( type: "LOGOUT" );
    ;

    handleLoginClick=()=>
    
      if (this.props.isLoggedIn === true)  
        this.logout()
      
      else
        this.login()
      
      
    
    render()...


function mapStateToProps(state) 
    return 
        isLoggedIn: state.isLoggedIn
    ;


export default connect(mapStateToProps)(Login);

【讨论】:

【参考方案2】:

基本上约定是使用身份验证上下文来管理状态,或者您也可以将身份验证方法也放入上下文中。我只是快速搜索了这个例子,找到了一个干净的例子here。

【讨论】:

【参考方案3】:

最好的基本方法之一是在用户登录时设置一个 localStorage 值,并在用户注销时删除该值。像这样的:

const auth = localStorage.getItem("islogin");

if (islogin)  // if there is a value named as islogin...
  <Button>Logout</Button>
 else  
  <Button>Login</Button>

【讨论】:

我尝试按照您的建议进行操作,并根据您的建议更新了我的答案。但基本上它没有工作,即使它显然应该有

以上是关于登录后如何从导航栏中删除登录按钮的主要内容,如果未能解决你的问题,请参考以下文章

从角度 8 的导航栏中选择一个选项后,如何使侧面导航保持不变并且内容单独消失?

用户登录php后更改导航栏

按下视图控制器后删除“返回”按钮

从 SwiftUI 中的导航栏中删除后退按钮文本

有人知道如何从导航栏中删除不需要的动画吗?截图

登录 vuejs 后重新渲染导航栏