Добавление внешней маршрутизации в ядро ​​технологического стека на 2019 год.

Это одна из статей, которые добавляют дополнительные функциональные возможности во интерфейсные и серверные приложения, разработанные в статье Tech Stack 2019: Core.

Окончательный результат этой статьи доступен в ветви frontend-routing репозитория tech-stack-2019-frontend (TODO). Бэкэнд не изменился по сравнению с основной статьей tech-stack-2019-backend .

Что и почему

По мере роста сложности внешнего интерфейса приложения, несомненно, начнут менять экраны (или их части), чтобы открывать дополнительные функции (также известные как навигация). Хотя это относительно легко сделать с помощью всего лишь React, существует ряд преимуществ использования сторонней библиотеки React Router для навигации.

  • Поскольку React Router является зрелым, многие люди с ним знакомы.
  • Кроме того, благодаря своей зрелости он имеет большое количество функций.
  • Его синтаксис декларативен; это легко понять
  • Можно легко использовать функцию навигации из любого места приложения, даже из глубоко вложенных компонентов.
  • В качестве бонуса он поддерживает изменение местоположения браузера; включение прямых ссылок в приложение

Пример

На простом примере с двумя экранами мы исследуем некоторые ключевые особенности React Router.

Сначала устанавливаем React Router:

npm install react-router-dom
npm install @types/react-router-dom

Кроме того, нам необходимо обновить webpack.config.js, чтобы разрешить webpack-dev-server поддерживать изменение местоположения браузера.

...
module.exports = (env) => ({
  ...
  devServer: {
    ...
    historyApiFallback: true,
  },
}
...

Затем мы меняем вверх (src / components / App.tsx) для маршрутизации между двумя экранами (компоненты Home и Hello); по умолчанию используется Домашняя страница, если совпадений нет.

Компонент Home (src / components / Home.tsx) - это простой функциональный компонент без сохранения состояния.

Hello, (src / components / Hello.tsx), по сути, то, что было предыдущим компонентом App; получает Hello API:

Компонент Nav (src / components / Nav.tsx) использует компонент React Router Link для создания a тег, ссылающийся на URL. Однако под капотом React Router перехватывает навигацию браузера и, скорее, использует свою логику маршрутизации для монтирования / размонтирования компонентов.

Иногда, например, чтобы вернуться назад, необходимо получить прямой доступ к объекту history для функций навигации. Хотя объект history предоставляется в качестве свойства для компонентов, передаваемых в команду Route, его нужно будет тщательно детализировать (передать вниз по цепочке компонентов). вложенные дети.

Или лучше использовать компонент более высокого порядка React Router withRouter для передачи объекта истории в обернутый компонент, как это сделано в компоненте Back (src / components / Back / index.ts).

Будучи упакованным, компонент BackView (src / components / Back / BackView.tsx) использует предоставленный объект истории для перехода назад.

Мы применили одну тонкую концепцию TypeScript и React, которая заслуживает некоторого внимания, - это запись PureComponent ‹RouteComponentProps›.

В JavaScript и React мы используем систему проверки типов во время выполнения, PropTypes, для проверки свойств компонента. Однако с помощью TypeScript мы можем выполнить ту же проверку во время компиляции (и с правильно настроенным редактором во время редактирования).

React использует универсальные шаблоны TypeScript для проверки этого типа; в этом случае мы используем интерфейс React Router RouteComponentProps. Проблема, однако, в том, что часто эти функции TypeScript плохо документированы, например как узнать о RouteComponentProps?

К счастью, сообщения об ошибках компилятора TypeScript дают подсказку о необходимом типе; в этом случае передается компоненту более высокого порядка withRouter параметр (другой компонент) без надлежащего определения свойств.

Подведение итогов

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