Зауважте, ця відповідь стосується React Router версії 0.13.x - наступна версія 1.0 виглядає так, що вона буде мати суттєво різні деталі реалізації
Сервер
Це мінімальний показник server.js
для реактора-маршрутизатора:
var express = require('express')
var React = require('react')
var Router = require('react-router')
var routes = require('./routes')
var app = express()
// ...express config...
app.use(function(req, res, next) {
var router = Router.create({location: req.url, routes: routes})
router.run(function(Handler, state) {
var html = React.renderToString(<Handler/>)
return res.render('react_page', {html: html})
})
})
Де routes
модуль експортує список маршрутів:
var React = require('react')
var {DefaultRoute, NotFoundRoute, Route} = require('react-router')
module.exports = [
<Route path="/" handler={require('./components/App')}>
{/* ... */}
</Route>
]
Щоразу, коли запит робиться на сервері, ви створюєте одноразовий Router
екземпляр, налаштований на вхідну URL-адресу як його статичне розташування, яке вирішується проти дерева маршрутів для встановлення відповідних відповідних маршрутів, зворотний виклик із найвищим рівнем обробник маршруту, який повинен бути наданий, і запис про те, які дочірні маршрути відповідають на кожному рівні. Це те, що консультується, коли ви використовуєте <RouteHandler>
компонент в компоненті обробки маршруту для надання дочірнього маршруту, який був зіставлений.
Якщо у користувача вимкнено JavaScript або він повільно завантажується, будь-які посилання, на які він натискає, знову потраплять на сервер, який знову буде вирішено як вище.
Клієнт
Це мінімально client.js
для реактора-маршрутизатора (повторне використання того ж модуля маршрутів):
var React = require('react')
var Router = require('react-router')
var routes = require('./routes')
Router.run(routes, Router.HistoryLocation, function(Handler, state) {
React.render(<Handler/>, document.body)
})
Коли ви телефонуєте Router.run()
, він створює для вас екземпляр маршрутизатора поза кадром, який повторно використовується щоразу, коли ви переходите через додаток, оскільки URL-адреса може бути динамічною для клієнта, на відміну від сервера, де в одному запиті є фіксована URL-адреса.
У цьому випадку ми користуємось тим HistoryLocation
, що використовує History
API, щоб переконатися, що правильне відбувається при натисканні на кнопку назад / вперед. Там же є HashLocation
адреса, яка змінює URL-адресу, hash
щоб робити записи в історію, і слухає window.onhashchange
подію для запуску навігації.
Коли ви використовуєте <Link>
компонент реактора-маршрутизатора , ви надаєте йому to
опору, яка є назвою маршруту, плюс будь params
-які query
дані та потрібні маршруту. <a>
Чиниться цей компонент має onClick
обробник , який в кінцевому рахунку викликає router.transitionTo()
на екземплярі маршрутизатора з реквізитом ви дали посилання, яка виглядає наступним чином :
/**
* Transitions to the URL specified in the arguments by pushing
* a new URL onto the history stack.
*/
transitionTo: function (to, params, query) {
var path = this.makePath(to, params, query);
if (pendingTransition) {
// Replace so pending location does not stay in history.
location.replace(path);
} else {
location.push(path);
}
},
Для звичайного посилання це в кінцевому підсумку вимагає location.push()
будь-якого типу місцеположення, який ви використовуєте, який обробляє деталі налаштування історії, щоб переходити навігація кнопками назад і вперед, а потім передзвонить, щоб router.handleLocationChange()
маршрутизатор знав, що може продовжувати перехід до новий шлях до URL-адреси.
Потім маршрутизатор викликає свій власний router.dispatch()
метод за допомогою нової URL-адреси, який обробляє деталі визначення того, який з налаштованих маршрутів відповідає URL-адресі, а потім викликає будь-які гачки переходу, присутні для відповідних маршрутів. Ви можете застосувати ці гачки переходу на будь-якому з ваших обробників маршрутів, щоб вжити певних дій, коли маршрут збирається податись або переходити до нього, з можливістю перервати перехід, якщо все не подобається вам.
Якщо перехід не було скасовано, завершальним кроком є виклик зворотного дзвінка, який ви надіслали, за Router.run()
допомогою компонента обробника верхнього рівня та об'єкта стану з усіма деталями URL-адреси та відповідних маршрутів. Компонент обробника верхнього рівня - це фактично сам Router
екземпляр, який обробляє візуалізацію самого верхнього обробника маршруту, який був зіставлений.
Вищеописаний процес запускається щоразу, коли ви переходите до нової URL-адреси клієнта.
Приклад проектів