React js Router меняет URL-адрес, но не загружает страницу

У меня большая проблема, я использую реагировать BrowserRouter, Link и Switch для управления маршрутизацией моего веб-сайта, моя проблема в том, что когда я нажимаю на ссылку, она изменяется по URL-адресу, но не отображается, однако, когда я обновляю страницу, она работает.

Это моя страница Index.js:

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import Home from './Home';
import Header from './Header';
import Footer from './Footer';
import Resume from './Resume';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(<Header />, document.getElementById('header'));

ReactDOM.render((
    <BrowserRouter>
        <Switch>
            <Route exact path  = "/" component = {Home} />
            <Route path  = "/resume" component = {Resume} />
        </Switch>
    </BrowserRouter>
), document.getElementById('root'));

ReactDOM.render(<Footer/>, document.getElementById('footer'));


serviceWorker.unregister();

Это код Header.js:

import React, { Component } from 'react';
import bImg from './img/moi2.jpg';
import { BrowserRouter, Link } from 'react-router-dom';

/**
 * Composant définissant l'entête de la page (Navigation et la photo de début)
 * Link est utilisé à la place de <a> pour la gestion des routes.
 * @Author 
 * @date 15th november 2018
 */

class Header extends Component{
    render(){
        return(
           <div>
               <BrowserRouter>
                    <nav className = "navbar navbar-expand-lg navbar-light fixed-top" id = "mainNav">
                        <div className = "container">

                            <Link className = "navbar-brand" to = "/">Iam Root</Link>

                            <button className = "navbar-toggler navbar-toggler-right" type = "button" data-toggle = "collapse"
                                    data-target = "#navbarResponsive" aria-controls = "navbarResponsive" aria-expanded = "false"
                                    aria-label = "Toggle navigation">
                                Menu
                                <i className = "fas fa-bars"></i>
                            </button>

                            <div className = "collapse navbar-collapse" id = "navbarResponsive">
                                <ul className = "navbar-nav ml-auto">
                                    <li className = "nav-item">
                                        <Link to = "/resume">Mon CV</Link>
                                    </li>
                                    <li className = "nav-item">
                                        <Link to = "/tutoriels">Tutoriels</Link>
                                    </li>
                                    <li className = "nav-item">
                                        <Link to = "/contact">Contactez-moi</Link>
                                    </li>
                                </ul>
                            </div>

                        </div>
                    </nav>
               </BrowserRouter>
                <header className = "masthead" style = {{backgroundImage: `url(${bImg})`}}>
                    <div className = "overlay"></div>
                    <div className = "container">
                        <div className = "row">
                            <div className = "col-lg-8 col-md-10 mx-auto">
                                <div className = "site-heading">
                                    <h1 style = {{ opacity: 0.4}}>prenom nom</h1>
                                    <span className = "subheading">
                                        Fonction
                                    </span>
                                </div>
                            </div>
                        </div>
                    </div>
                </header>
           </div>
        );
    }
}

export default Header;

Это мой код Resume.js:

import React, { Component } from 'react';

class Resume extends Component{

    render(){
        return(
            <div>
                Hello x's Resume
            </div>
        );
    }
}
export default Resume;

Home и Footer такие же простые, как Resume.js

Заранее большое спасибо за вашу помощь.

Заворачиваете ли вы какими-нибудь другими HOC? Например. Redux? Иногда это может вызвать проблемы.

Colin Ricardo 18.11.2018 13:05

Нет, я не использую Redux или что-то еще.

Pvkndux 19.11.2018 00:17
Поведение ключевого слова "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) для оценки ваших знаний,...
3
2
3 267
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы визуализируете заголовок и другую часть приложения отдельно, потому что React Router фактически не знает о другой части вашего приложения, поэтому он не может перезагрузить страницу. Что вам нужно сделать, так это создать что-то вроде компонента макета и поместить туда все свои компоненты, чтобы у вас был один Hoc BrowserRouter.

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

Вам нужно только иметь BrowserRouter в своем компоненте, чтобы все маршруты знали, на какой маршрутизатор они подписываются, и в то же время ссылки обновляли данные в правильном провайдере маршрутизатора.

В вашем случае элементы заголовка и корня обернуты различными BrowserRouter, и, следовательно, компонент Links в заголовке обновляет включающий поставщик Router, на который другой Routes в файле index.js не подписывается, и, следовательно, он работает неправильно.

Поэтому вместо рендеринга различных элементов с помощью ReactDOM.render вы можете делать это просто как

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import Home from './Home';
import Header from './Header';
import Footer from './Footer';
import Resume from './Resume';
import * as serviceWorker from './serviceWorker';


ReactDOM.render((
    <BrowserRouter> 
        <div>
          <div id = "header">
            <Route component = {Header} />
          </div>
          <Switch>
              <Route exact path  = "/" component = {Home} />
              <Route path  = "/resume" component = {Resume} />
          </Switch>
          <div id = "footer">
            <Route component = {Footer} />
          </div>
        </div>
    </BrowserRouter>
), document.getElementById('root'));


serviceWorker.unregister();

И Header.js

import React, { Component } from 'react';
import bImg from './img/moi2.jpg';
import { BrowserRouter, Link } from 'react-router-dom';

/**
 * Composant définissant l'entête de la page (Navigation et la photo de début)
 * Link est utilisé à la place de <a> pour la gestion des routes.
 * @Author 
 * @date 15th november 2018
 */

class Header extends Component{
    render(){
        return(
           <div>
                    <nav className = "navbar navbar-expand-lg navbar-light fixed-top" id = "mainNav">
                        <div className = "container">

                            <Link className = "navbar-brand" to = "/">Iam Root</Link>

                            <button className = "navbar-toggler navbar-toggler-right" type = "button" data-toggle = "collapse"
                                    data-target = "#navbarResponsive" aria-controls = "navbarResponsive" aria-expanded = "false"
                                    aria-label = "Toggle navigation">
                                Menu
                                <i className = "fas fa-bars"></i>
                            </button>

                            <div className = "collapse navbar-collapse" id = "navbarResponsive">
                                <ul className = "navbar-nav ml-auto">
                                    <li className = "nav-item">
                                        <Link to = "/resume">Mon CV</Link>
                                    </li>
                                    <li className = "nav-item">
                                        <Link to = "/tutoriels">Tutoriels</Link>
                                    </li>
                                    <li className = "nav-item">
                                        <Link to = "/contact">Contactez-moi</Link>
                                    </li>
                                </ul>
                            </div>

                        </div>
                    </nav>
                <header className = "masthead" style = {{backgroundImage: `url(${bImg})`}}>
                    <div className = "overlay"></div>
                    <div className = "container">
                        <div className = "row">
                            <div className = "col-lg-8 col-md-10 mx-auto">
                                <div className = "site-heading">
                                    <h1 style = {{ opacity: 0.4}}>prenom nom</h1>
                                    <span className = "subheading">
                                        Fonction
                                    </span>
                                </div>
                            </div>
                        </div>
                    </div>
                </header>
           </div>
        );
    }
}

export default Header;

После внесения этого изменения ваше приложение должно работать должным образом.

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