React router - <Route /> не отображает, если <Link> не находится в том же компоненте

Я пытаюсь отформатировать свой HTML так, внутри тега body:

<header id = "header"></header>

<main id = "app"></main>

<footer id = "footer"></footer>

Причина в том, что у меня навигация из <main></main> и в <header></header>

Я также визуализирую соответствующий компонент React индивидуально, например: document.getElementById("header"), document.getElementById("app") ...:

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

При нажатии <Link to = "/log-in"></Link> в <Header /> он выходит из SPA и переходит на страницу /log-in.

Что мне здесь не хватает?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
368
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Давайте перейдем к реструктуризации, чтобы ваше приложение стало лучше:

App.js

import React from 'react';
import { Main } from './components';
const App = () => (
    <Main />
)

ReactDOM.render(<App />, document.getElementById("app"));

Main.js

import React from 'react';
import { Router, Route } from 'react-router-dom';
import { Header, Login, Register, Home } from './components'

const Main = () => (
 <Router>
    <React.Fragment>
      <Header />

      <Route exact path = "/" component = {Home} />
      <Route path = "/login" component = {Login} />
      <Route path = "/register" component = {Register} />

      <Footer />
    </React.Fragment>
  </Router>
)

export { Main };

Таким образом, на самом деле мы всегда визуализируем только один экземпляр. Ваш верхний / нижний колонтитулы будут размещены за пределами маршрутизатора, поэтому при изменении маршрута они останутся неизменными. Имейте в виду, что это вызовет затруднения, например, если вы хотите, чтобы ваш заголовок выделял активный маршрут, самый простой способ, поскольку он находится за пределами маршрутизатора и не получает от него реквизиты, - это проверить URL-адрес. Также обратите внимание, что здесь мы используем <React.Fragment>, но вы можете использовать <div> или что-нибудь еще, что вам нравится. Маршрутизатор ожидает только одного дочернего элемента, поэтому, если вам не нужны дополнительные элементы html, вы можете использовать фрагмент!

спасибо @Predrag за пояснение, что при многократном использовании ReactDOM.render экземпляры не знают друг друга

soups 08.12.2018 23:12

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