React Router V4 обновляет URL-адрес, но не обновляет страницу

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

ReactDOM.render((
    <BrowserRouter>
        <App />
    </BrowserRouter>
), document.getElementById('root'))

Класс приложения:

class App extends React.Component {
  render() {
    return (
      <div className = "App">
        <Navbar/>
      </div>
    );
  }
}

Класс Navbar:

 class  Navbar extends React.Component {
 render(){
    return (
        <Nav bsStyle = "tabs"> 
            <LinkContainer to = "/login" >
                <NavItem >
                        LogIn
                </NavItem>
            </LinkContainer>
            <LinkContainer to = "/Register" >
                <NavItem >
                    Register
                </NavItem>  
            </LinkContainer>
            <Router>
                <BrowserRouter>
                    <Switch>
                        <Route path = "/Register" component = {Register}  />
                        <Route path = "/Login" component = {Login}  />
                    </Switch>
                </BrowserRouter>
            </Router>
        </Nav> 
    ) 
}}                                         

Ваш BrowserRouter должен быть компонентом верхнего уровня. А зачем вам их 2 на месте?

Sushanth -- 07.08.2018 20:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
3 563
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

У вас есть маршрутизация внутри компонента Navbar, это не сработает.

Измените свой index.js, чтобы он выглядел так:

ReactDOM.render((
    <BrowserRouter>
        <Switch>
          <Route path = "/Register" component = {Register}  />
          <Route path = "/Login" component = {Login}  />
          <Route path = "/" component = {App} />
        </Switch>
     </BrowserRouter>
), document.getElementById('root'))

Это должно сработать, дайте мне знать, если возникнут проблемы. Также удалите элементы и дочерние элементы BrowserRouter из Navbar.

Ответ принят как подходящий

Вам потребуется ваш BrowserRouter как компонент верхнего уровня. nav - это место, которое определяет, какой компонент должен быть визуализирован.

ReactDOM.render(<App />, document.getElementById('root'));

App.js

class App extends React.Component {
  render() {
    return (
      <div className = "App">
           <Navbar/>

           <Router>
                <BrowserRouter>
                    <Switch>
                        <Route path = "/Register" component = {Register}  />
                        <Route path = "/Login" component = {Login}  />
                    </Switch>
                </BrowserRouter>
            </Router>
      </div>
    );
  }
}

Nav.js

class  Navbar extends React.Component {
 render(){
    return (
        <Nav bsStyle = "tabs"> 
            <LinkContainer to = "/login" >
                <NavItem >
                        LogIn
                </NavItem>
            </LinkContainer>
            <LinkContainer to = "/Register" >
                <NavItem >
                    Register
                </NavItem>  
            </LinkContainer>
        </Nav> 
    ) 
}}      

@TomKarnaski Рад, что у вас все получилось. Если это решило проблему, выберите тот, который решил вашу проблему, чтобы это помогло другим искать ответы.

Sushanth -- 07.08.2018 20:22

использовать BrowserRouter внутри маршрутизатора

<Router>
   <BrowserRouter>
      <Switch>
...
      </Switch>
   </BrowserRouter>
</Router>

Добавьте описание, объясняющее, почему ваше решение решает его проблему или что он сделал не так

Ran Marciano 25.11.2020 10:35

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