Перенаправляет в предыдущее состояние после щелчка Nav Link?

Итак, у меня есть панель навигации, которая, когда пользователь нажимает "Выйти", отображает панель навигации, которую видит не авторизованный пользователь. Пока что у меня это не работает, но моя проблема в том, что когда я нажимаю один из других кликов на моей веб-странице, например, "О программе", панель навигации возвращается в состояние "Выйти". Как мне исправить это? Я думаю, это потому, что в моем исходном коде App.js userId: 123(в целях тестирования), который жестко закодирован и всегда запускает это.

CustomNavbar.js

import React, { Component } from 'react'
import { Navbar, Nav, NavItem } from 'react-bootstrap';

class CustomNavbar extends Component {

    render() {
        if (this.props.userID === null) {
            return (
                <div>
                    <Navbar collapseOnSelect expand="md" bg="dark" variant="dark">
                        <Navbar.Brand href="/">
                            Ndnu's Notes
                        </Navbar.Brand>
                        <Navbar.Toggle aria-controls="responsive-navbar-nav" />
                        <Navbar.Collapse id="responsive-navbar-nav">
                        </Navbar.Collapse>
                    </Navbar>
                    <Navbar className="footer text-center" fixed="bottom" expand="lg" bg="light">
                        <Nav.Link href="/contactus">Contact Us</Nav.Link>
                        <Nav.Link href="/privacyterms">Privacy & Terms</Nav.Link>
                        <Nav.Link href="/about">About</Nav.Link>
                    </Navbar>
                </div>
            )
        } else {    
            return (
                <div>
                    <Navbar collapseOnSelect expand="md" bg="dark" variant="dark">
                        <Navbar.Brand href="/">
                        Ndnu's Notes
                    </Navbar.Brand>
                    <Navbar.Toggle aria-controls="responsive-navbar-nav" />
                        <Navbar.Collapse id="responsive-navbar-nav">
                            <Nav className="mr-auto">
                            </Nav>
                            <Nav>
                                <Nav.Link eventKey={2} href="/myAccount"> <i class="fas fa-user"></i> My Account</Nav.Link>
                                <Nav.Link eventKey={1} href="/" onClick={this.props.logUserOut}> <i class="fas fa-sign-out-alt"></i> Log Out</Nav.Link>
                            </Nav>
                        </Navbar.Collapse>
                    </Navbar>

                    {/* Footer */}
                    <Navbar fixed="bottom" bg="light">
                        <Nav.Link href="/contactus">Contact Us</Nav.Link>
                        <Nav.Link href="/privacyterms">Privacy & Terms</Nav.Link>
                        <Nav.Link href="/about">About</Nav.Link>
                    </Navbar>
                </div>
            )
        }
    }
}
export default CustomNavbar

App.js

import React from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import LoginAndRegister from './LoginAndRegister'
import ContactUs from './Components/ContactUs.js';
import PrivacyTerms from './Components/PrivacyTerms.js';
import CustomNavbar from './Components/CustomNavbar.js';
import About from './Components/About.js';
import Table from './Components/Table.js';

class App extends React.Component {

constructor() {
    super();
    this.state = {
        userID: 123
    }
}
logUserOut = (e) => {
    e.preventDefault()
    this.setState({userID: null});
}

render() {
    return (
        <Router>
            <div>
                <CustomNavbar userID={this.state.userID} logUserOut={this.logUserOut} />
                <Route exact strict path="/contactus" component={ContactUs} />
                <Route exact strict path="/about" component={About} />
                <Route exact strict path="/privacyterms" component={PrivacyTerms} />
                  {!this.state.userID && <LoginAndRegister userID={this.state.userID}/>}
                <Table />
            </div>
        </Router>
    )
}
}
    export default App;

1 ответ

Вам лучше сохранять состояние пользователя loggedIn в localstorage, а не проверять состояние. И проверьте, вошел ли пользователь в систему или нет, чтобы отобразить желаемый результат.

Вам нужно будет хранить пользовательскую информацию в каком-то центральном месте, где вы можете легко получить к ней доступ на каком-то вложенном компоненте вместо передачи состояний в качестве подпорки.

Другим вариантом может быть контекстный API для доступа к пользовательскому состоянию loggedIn.

Похоже на страницу перезагрузки state.userID значение не там после перезагрузки. Из вашего кода вы устанавливаете userID в конструкторе это будет называться старением на этапе монтирования жизненного цикла компонента.

Пин мне в случае любого запроса:)

Другие вопросы по тегам