简体   繁体   English

当 state 更改时重新呈现导航栏

[英]navbar re rendered when state changed

I'm fairly new to react and JSX, and looking for some help!我对 React 和 JSX 还很陌生,正在寻求帮助!

I have part of my app that pulls state from redux to show if a user is logged in, and I just want to render the navbar component because some things are behind protected routes.我的应用程序的一部分从 redux 中提取 state 以显示用户是否已登录,我只想渲染导航栏组件,因为有些东西在受保护的路线后面。 Everything is working how I want it to, except that I have to refresh the page to make the changes happen, so I'm looking to just have it update based on the state passed to it when it changes OR could be part of an onclick event in the logout component一切都按我想要的方式工作,除了我必须刷新页面以进行更改,所以我希望它根据 state 在更改时传递给它或可能是 onclick 的一部分进行更新注销组件中的事件

Here's the navbar component这是导航栏组件

export default class Navbar extends Component {

  render() {
  
  const storeAuth = store.getState();
  const isLoggedIn = (storeAuth['auth']['isAuthenticated'])

    if(isLoggedIn){
      return (
        <nav className="navbar navbar-dark bg-dark navbar-expand-lg">
          <Link to="/login" className="navbar-brand">CHK List</Link>
          <div className="collpase navbar-collapse">
          <ul className="navbar-nav mr-auto">
            <li className="navbar-item">
            <Link to="/list" className="nav-link">Daily Checklist </Link>
            </li>
            <li className="navbar-item">
            <Link to="/editlist" className="nav-link">Edit Checklist</Link>
            </li>
            <li className="navbar-item">
            <Link to="/Register" className="nav-link">Register New Users</Link>
            </li>
            <li className="navbar-item">
            <Link to="/Logout" className="nav-link">Logout</Link>
            </li>
          </ul>
          </div>
        </nav>
      );
    }else{
      return (
        <nav className="navbar navbar-dark bg-dark navbar-expand-lg">
          <Link to="/dashboard" className="navbar-brand">CHK List</Link>
          <div className="collpase navbar-collapse">
          <ul className="navbar-nav mr-auto">
          
            <li className="navbar-item">
            <Link to="/login" className="nav-link">Login</Link>
            </li>
          </ul>
          </div>
        </nav>
      );
    }
  }
}

And this is the Logout component where the onclick event这是 onclick 事件所在的注销组件

    class Dashboard extends Component {
  onLogoutClick = e => {
    e.preventDefault();
    this.props.logoutUser();
  };

  

  render() {
    
    const { user } = this.props.auth;

    return (
      <div style={{ height: "75vh" }} className="container valign-wrapper">
        <div className="row">
          <div className="landing-copy col s12 center-align">
            <h4>
              <b>Hey {user.name.split(" ")[0]}</b> <p></p>
              <p className="flow-text grey-text text-darken-1">
                Are you sure you want to logout?
              </p>
            </h4>
            <button 
            style={{
                width: "150px",
                borderRadius: "3px",
                letterSpacing: "1.5px",
                marginTop: "1rem"
              }} 
              onClick={this.onLogoutClick} 
              className="btn btn-large waves-effect waves-light hoverable blue accent-3">
              Logout
            </button>
          </div>
        </div>
      </div>
    );
  }
}

Dashboard.propTypes = {
  logoutUser: PropTypes.func.isRequired,
  auth: PropTypes.object.isRequired
};

You can try using mapStateToProps function.您可以尝试使用 mapStateToProps function。

import {connect} from 'react-redux';



 class Navbar extends Component {

  render() {
 
  let isLoggedIn = this.props.isLoggedIn 

if(isLoggedIn){
  return (
    <nav className="navbar navbar-dark bg-dark navbar-expand-lg">
      <Link to="/login" className="navbar-brand">CHK List</Link>
      <div className="collpase navbar-collapse">
      <ul className="navbar-nav mr-auto">
        <li className="navbar-item">
        <Link to="/list" className="nav-link">Daily Checklist </Link>
        </li>
        <li className="navbar-item">
        <Link to="/editlist" className="nav-link">Edit Checklist</Link>
        </li>
        <li className="navbar-item">
        <Link to="/Register" className="nav-link">Register New Users</Link>
        </li>
        <li className="navbar-item">
        <Link to="/Logout" className="nav-link">Logout</Link>
        </li>
      </ul>
      </div>
    </nav>
  );
}else{
  return (
    <nav className="navbar navbar-dark bg-dark navbar-expand-lg">
      <Link to="/dashboard" className="navbar-brand">CHK List</Link>
      <div className="collpase navbar-collapse">
      <ul className="navbar-nav mr-auto">
      
        <li className="navbar-item">
        <Link to="/login" className="nav-link">Login</Link>
        </li>
      </ul>
      </div>
    </nav>
  );
}
  }
}

const mapStateToProps=(state)=>{
return {
    isLoggedIn : state.auth.isAuthenticated
}
}
 export default connect(mapStateToProps)(Navbar )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM