Низкоуровневый маршрутизатор из React-Router-Dom переходит только к новому URL, но не отображает компоненты

#reactjs #react-router

#reactjs #react-router

Вопрос:

Прежде всего, я новичок в мире Typescript и React, поэтому, пожалуйста, потерпите меня.

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я перемещаюсь, используя, например, кнопки, отображаемые как «NavLink» или «Link» из react-router-dom пакета, в результате изменяется только URL, и ничего не отображается.

Если я нажимаю enter в адресной строке (принудительно запускаю указанный URL), компоненты отображаются, в противном случае я вижу только фон моих приложений.

Разница со всеми другими вопросами, которые я мог найти здесь, на SO и других сайтах, заключается в том, что я не использую высокоуровневый BrowserRouter but Router , чтобы я мог использовать createBrowserHistory() и передавать его маршрутизатору, а также использовать его из MobX, когда это необходимо.

Самое странное — я использовал тот же код в другом приложении для маршрутизации, и он работает нормально. Версия react-router была 5.1.3, теперь у меня 5.1.5, поэтому я полагаю, что это что-то еще, чего я не вижу.

Что еще более странно — если я BrowserRouter переключусь на низкоуровневый, все работает нормально — похоже, что, возможно, есть какая-то проблема с history пакетом, который я использую?

index.tsx:

 import React from 'react';
import ReactDOM from 'react-dom';
import "./app/layout/styles.css";
import App from './app/layout/App';
import * as serviceWorker from './serviceWorker';
import 'semantic-ui-css/semantic.min.css'
import { createBrowserHistory } from 'history';
import { Router } from 'react-router-dom';

export const history = createBrowserHistory();

ReactDOM.render(
  <Router history={history}>
    <App />
  </Router>,
  document.getElementById('root')
);

serviceWorker.unregister();
  

App.tsx:

 import { observer } from "mobx-react-lite";
import React, { Fragment } from "react";
import {
  Route,
  RouteComponentProps,
  Switch,
  withRouter,
} from "react-router-dom";
import { ToastContainer } from "react-toastify";
import { Container } from "semantic-ui-react";
import CheckinAuthorize from "../../features/checkin/CheckinAuthorize";
import CheckinDetails from "../../features/checkin/CheckinDetails";
import HomePage from "../../features/home/HomePage";
import NavBar from "../../features/nav/NavBar";
import NotFound from "./NotFound";

const App: React.FC<RouteComponentProps> = ({ location }) => {
  return (
    <Fragment>
      <Route exact path="/" component={HomePage} />
      <Route
        path={"/(. )"}
        render={() => (
          <Fragment>
            <ToastContainer position='bottom-right'/>
            <NavBar />
            <Container style={{ marginTop: "7em" }}>
              <Switch>
                <Route exact path="/" component={HomePage} />
                <Route exact path="/checkin" component={CheckinAuthorize} />
                <Route path="/checkin/:id" component={CheckinDetails} />
                <Route component={NotFound} />
              </Switch>
            </Container>
          </Fragment>
        )}
      />
    </Fragment>
  );
};

export default withRouter(observer(App));
  

Пример того, как я использую NavLinks:

 import React from "react";
import { Menu, Container } from "semantic-ui-react";
import { observer } from "mobx-react-lite";
import { NavLink } from "react-router-dom";

const NavBar: React.FC = () => {
  return (
    <div>
      <Menu fixed="top" inverted>
        <Container>
          <Menu.Item header as={NavLink} exact to="/">
            <img
              src="/assets/logo.png"
              alt="logo"
              style={{ marginRight: "10px" }}
            />
            Home
          </Menu.Item>
        </Container>
      </Menu>
    </div>
  );
};

export default observer(NavBar);

  

Ответ №1:

Так что, по-видимому, это было связано с пакетом «история».

Я удалил пакет истории, который я ранее установил (сделал yarn remove history ), и у меня все начало работать. Кажется, я был слишком активен, добавив этот пакет в свой проект. Теперь импорт указывает на node_modules/@types/history/index то, что я не устанавливал явно, вероятно, зависимость.

Хотя вопрос на самом деле не связан с ответом, я оставлю его как есть — возможно, у кого-то будет такая же проблема, и он наткнется на нее. Жаль, что у меня не было такой возможности 🙂

Ответ №2:

Такие проблемы можно игнорировать, переключившись на BrowserRouter, но просто для понимания реальной проблемы. Это для тех парней, которые действительно хотят использовать низкоуровневый маршрутизатор. Проблема связана с установленным вами пакетом истории. Попробуйте использовать предыдущие версии, такие как 4.7.2, которые позволяют вашему импорту экспортировать createHistory по умолчанию из истории / createBrowserHistory вместо последних, которые импортируют именованный экспорт createBrowserHistory из истории напрямую.

Из того, что я испытал, последняя история позволяет изменять маршруты только при обновлении страницы, а также для navlink или link он не обрабатывает какие-либо маршруты, просто изменяет URL.

ну, вот и все, надеюсь, это кому-то поможет.