React-Router useHistory() во вложенном функциональном компоненте

У меня возникла проблема с запуском хука useHistory() в моем приложении. Это работает в дочерних элементах верхнего уровня <Route>, но в любом компоненте, включенном в этот дочерний элемент верхнего уровня, он не работает.

Лучше объяснить с кодом.

В контейнере Frame:

const { path } = useRouteMatch();

<Switch>
   <Route path = {`${path}/reading`} exact>
     <Reading />
   </Route>
</Switch>

В компоненте Reading:

export default function Reading(props) {

   const history = useHistory();
   // history is correct here and contains the pop(), push(), etc.

   return (
      <>
         <Navbar />
      </>
  );

}

В компоненте Navbar:

export default function Navbar(props) {

    let history = useHistory();
    // history is undefined here - WHY??

    return (
       // navbar JSX code here
    );

}

Почему useHistory() не работает в компоненте Navbar? Мне кажется неправильным, что только дети верхнего уровня могут использовать этот хук, он должен быть доступен по цепочке, верно?

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

Ответы 2

useHistory не работает в компоненте, который не находится внутри Route. Так что используйте withRouter в компоненте навигационной панели.


import {withRouter} from "react-router-dom";


const Navbar=(props)=> {

    let history = useHistory();
    // history is undefined here - WHY??

    return (
       // navbar JSX code here
    );
}


export default withRouter(Navbar)

Это не компилируется. В нем говорится, что вы не можете использовать withRouter() вне маршрута

bluedevil2k 15.12.2020 19:27
Ответ принят как подходящий

Я понял это, надеюсь, это поможет кому-то еще. В моем проекте используется папка /app, а также папка /common для вещей, каждая из которых имеет свой собственный файл package.json. Панель навигации находилась в папке /common, а остальные файлы — в папке /app.

Что делает react-router-dom, так это сохраняет информацию об истории в собственном файле в папке /node_modules, а не где-либо в вашем приложении React. Итак, поскольку у меня было два файла package.json, у меня было две папки /node_modules, и поэтому панель навигации искала несуществующую историю, потому что она находилась в другой папке /node_modules.

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