Йо-йо! JS-фреймворки становятся всё более распространёнными, однако информации на русском языке не множится, никто не хочет ей делиться. Ну что же, придётся мне это сделать и сорвать немного хайпа на популярной теме.
В ноябре 2018 года я принял участие в сообществе haJS в формате frontend weekend. Целью было сравнить различные фрэймворки (React, Vue, Angular). Я выбрал React js из-за того, что хотел его изучить. Через некоторое время я прекратил участие в проекте, но результат моих трудов до сих пор остался на Github. Как раз на примере его кода я буду рассказывать про роутер в реакте.
Не буду останавливаться на этом долго, скажу только, что я использовал npm. Набираем:
npm install --save react-router-dom
Импортируем router в наш компонент. В своём примере я импортировал его только один раз. Пример
https://github.com/Hajsru/fw-front-react/blob/master/src/App.js
Код:
// Импорт самого роутера // Switch для переключения по роутам import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; // Импорт реакта // Suspense нужен для того, чтобы управлять html'лем, который будет показан во время загрузки компонента (новой страницы) // lazy позволяет визуализировать динамически добавленный контент, т.е. не загружать все страницы сразу import React, {Component, Suspense, lazy } from 'react';
Итак, когда мы всё импортировали, нам нужно обернуть в lazy наши компоненты.
// Список моих компонентов (страниц) const MainPage = lazy(() => import('./pages/mainPage/pageMain')); const EventsPage = lazy(() => import('./pages/eventsPage/pageEvents')); const SpeakersPage = lazy(() => import('./pages/speakersPage/pageSpeakers')); const ReportsPage = lazy(() => import('./pages/reportsPage/pageReports')); const RegisterPage = lazy(() => import('./pages/registerPage/pageRegister')); const DetailPage = lazy(() => import('./pages/detailPage/pageDetail'));
Заметьте, что в lazy мы помещаем стрелочную функцию.
Роуты я покажу уже на коде всего компонента. Так будет понятнее и мы сразу разберёмся с Suspense.
class App extends Component { render() { return ( <div className="app-container"> <aside className="app-aside"> <Header /> <NavbarAside /> </aside> <Router> <Suspense fallback={<div>Loading...</div>}> <Switch> // Роуты // Path - адрес страницы относительно корня // exact - роут по умолчанию // component - чистая функция <Route exact path="/" component={ (()=>(<MainPage />)) } /> <Route path="/events" component={(()=>(<EventsPage />))} /> <Route path="/speakers" component={(()=>(<SpeakersPage/>))} /> <Route path='/reports' component={(()=>(<ReportsPage />))} /> <Route path='/detail' component={(()=>(<DetailPage/>))} /> <Route path='/registration' component={(()=>(<RegisterPage />))} /> </Switch> </Suspense> </Router> </div> ); } }
Пожалуй тут самое важное то, что компонент — это чистая функция. Это может вызвать у некоторых проблемы и вся консоль будет пестрить краснотой. У себя я использовал эту конструкцию:
(()=>(<MainPage />))
Работа Router уже настроена, но если вы теперь будете перемещаться по ссылкам, то вы увидите, что экран моргает, а Suspense не работает.
Для того, чтобы изменить это, нам нужно изменить наше меню. Тут начинается «эксклюзив», я не успел выложить этот код на github проекта.
Вам нужно обернуть ссылки в меню и прочих местах в компонент </Link>, который приходит к нам с роутером
import { Link } from 'react-router-dom'; import React, { Component } from 'react'; class NavbarAside extends Component { render(){ return ( <nav className="app-nav"> <ul className="app-nav__list"> <li className="app-nav__list-item"> <Link to="/events">Митапы</Link> </li> <li className="app-nav__list-item"> <Link to="/speakers">Спикеры</Link> </li> <li className="app-nav__list-item"> <Link to="/reports">Доклады</Link> </li> <li className="app-nav__list-item"> <Link to="/detail">Страница доклада</Link> </li> <li className="app-nav__list-item"> <Link to="/registration">Регистрация на митап</Link> </li> </ul> </nav> ); } } export default NavbarAside;
Если вы будете следовать вышеперечисленными рекомендациями, то вы быстро усвоите основы react-router-dom
Надеюсь моя статья вам будет полезна. Кстати, моя библиотека stickjaw отлично работает с react и вы можете найти её на npm