Итак, я понимаю, как создавать отдельные компоненты, такие как форма, панель навигации и нижний колонтитул, но я не понимаю, как изменить состояние панели навигации, когда пользователь выходит из системы.
Например, страница входа в систему должна иметь форму с очень простой навигационной панелью и парой навигационных ссылок, но как только пользователь вошел в систему, навигационная панель должна включать навигационные ссылки «выход» и нижний колонтитул с парой навигационных ссылок, как Что ж.
Проблема, с которой я сталкиваюсь, когда я делаю свою, заключается в том, что когда я нажимаю ссылку «выйти», она отображает страницу входа, НО когда я нажимаю одну из других навигационных ссылок, панель навигации повторно отображает «вошедшую в систему» версию.
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:
}
}
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;
Я поставил userId: 123, чтобы имитировать пользователя, вошедшего в систему.





До этого момента не было похоже, что у вас есть какой-либо код, который проверяет при загрузке страницы, если ваш пользователь уже вошел в систему (проверив файл cookie или запросив сервер или что-то в этом роде). Это означает, что каждый раз, когда ваша страница загружается, ваше состояние входа будет соответствовать тому, что вы установили для своего исходного состояния. Вы делаете это в своем конструкторе App:
this.state = {
userID: 123 // you mentioned in your comments that this is what you used
}
Итак, когда страница изначально загружается, вот что происходит:
App вызывается конструктор, и начальное состояние устанавливается с помощью userID: 123. Итак, страница загружается с уже зарегистрированным пользователем 123. Вот почему вы видите панель навигации с доступными «Моя учетная запись» и «Выход».
Вы нажимаете «Выйти». Это правильно устанавливает userID на null. Вы вышли из системы. Вам больше не доступны «Моя учетная запись» или «Выход» на панели навигации.
Вы нажимаете на одну из других навигационных ссылок, например, «Свяжитесь с нами». Загружается новая страница. Все начинается сначала.
App конструктор вызывается снова, и начальное состояние снова возвращается к userID: 123. Ваш пользователь вошел в систему.
Чтобы исправить это, вы можете начать с установки userID: null в вашем конструкторе. Таким образом, с каждой новой загрузкой страницы пользователь начинает регистрировать вне. Но также, в конечном итоге, вам, вероятно, потребуется встроить код, который поддерживает (в браузере клиента) какой-то файл cookie, который сообщает вашему сайту, что пользователь вошел в систему, и поддерживает это состояние от загрузки одной страницы к другой.
Я создал песочница кода, который использует предоставленный вами код, но затем добавил некоторые модификации, чтобы продемонстрировать то, что я объяснил выше. В этой песочнице пользователь начинает вышли из. Когда вы нажимаете кнопку для имитации входа в систему, пользователь входит в систему. Но если вы нажмете ссылку на панели навигации, которая приведет вас на другую страницу, вы увидите, что пользователь снова вышел из системы.
Отдельно следует отметить, что часть вашего JSX-кода (в частности, теги <i> в CustomNavbar.js) используют реквизит class — их следует изменить на className или Реагировать будет жаловаться.
В
constructorдляApp.js, что вы устанавливаетеuserIDв состоянии? В настоящее время, используя толькоuserID:, вы должны получить синтаксическую ошибку. Это опечатка?