Uwaga, ta odpowiedź dotyczy React Router w wersji 0.13.x - nadchodząca wersja 1.0 wygląda na to, że będzie miała znacznie inne szczegóły implementacji
serwer
To minimum w server.js
przypadku routera React:
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})
})
})
Gdzie routes
moduł eksportuje listę tras:
var React = require('react')
var {DefaultRoute, NotFoundRoute, Route} = require('react-router')
module.exports = [
<Route path="/" handler={require('./components/App')}>
{/* ... */}
</Route>
]
Za każdym razem, gdy do serwera kierowane jest żądanie, tworzysz jednorazową Router
instancję skonfigurowaną z przychodzącym adresem URL jako jego statyczną lokalizacją, która jest rozpoznawana w drzewie tras w celu skonfigurowania odpowiednich dopasowanych tras, wywołując z powrotem z najwyższym poziomem program obsługi tras, który ma zostać wyrenderowany, oraz rekord, które trasy podrzędne są dopasowane na każdym poziomie. To jest właśnie to, co jest konsultowane podczas używania <RouteHandler>
komponentu w komponencie obsługi tras do renderowania trasy podrzędnej, która została dopasowana.
Jeśli użytkownik wyłączył JavaScript lub ładuje się wolno, wszystkie kliknięte przez niego linki ponownie trafią na serwer, co zostanie rozwiązane ponownie, jak powyżej.
Klient
To minimum w client.js
przypadku react-routera (ponowne użycie tego samego modułu tras):
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)
})
Kiedy dzwonisz Router.run()
, tworzy dla Ciebie instancję routera za kulisami, która jest ponownie używana za każdym razem, gdy nawigujesz po aplikacji, ponieważ adres URL może być dynamiczny na kliencie, w przeciwieństwie do serwera, na którym pojedyncze żądanie ma stały adres URL.
W tym przypadku używamy HistoryLocation
, który używa History
interfejsu API, aby upewnić się, że po naciśnięciu przycisku Wstecz / Dalej dzieje się właściwa rzecz. Istnieje również, HashLocation
który zmienia adres URL, hash
aby tworzyć wpisy historii i nasłuchuje window.onhashchange
zdarzenia, aby wyzwolić nawigację.
Kiedy używasz <Link>
komponentu react-router , dajesz mu to
atrybut, który jest nazwą trasy params
oraz innymi query
danymi, których potrzebuje trasa. <a>
Świadczonych przez tego składnika ma onClick
obsługi, która ostatecznie wywołuje router.transitionTo()
na przykład router z rekwizytami dałeś link, który wygląda tak:
/**
* 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);
}
},
W przypadku zwykłego łącza ostatecznie wywołuje to location.push()
dowolny używany typ lokalizacji, który obsługuje szczegóły konfiguracji historii, więc nawigacja za pomocą przycisków Wstecz i Dalej będzie działać, a następnie oddzwoni, aby router.handleLocationChange()
router wiedział, że może przejść do przejścia do nowa ścieżka adresu URL.
Następnie router wywołuje własną router.dispatch()
metodę z nowym adresem URL, który obsługuje szczegóły określania, która ze skonfigurowanych tras jest zgodna z adresem URL, a następnie wywołuje wszelkie zaczepy przejścia obecne dla dopasowanych tras. Możesz zaimplementować te haki przejścia na dowolnym z programów obsługi tras, aby podjąć pewne działania, gdy trasa ma być opuszczona lub do której ma być nawigowana, z możliwością przerwania przejścia, jeśli coś Ci się nie podoba.
Jeśli przejście nie zostało przerwane, ostatnim krokiem jest wywołanie wywołania zwrotnego, któremu dałeś, Router.run()
z komponentem obsługi najwyższego poziomu i obiektem stanu ze wszystkimi szczegółami adresu URL i dopasowanych tras. Komponent obsługi najwyższego poziomu jest w rzeczywistości Router
samą instancją, która obsługuje renderowanie najwyższego poziomu obsługi trasy, który został dopasowany.
Powyższy proces jest uruchamiany ponownie za każdym razem, gdy przejdziesz do nowego adresu URL na kliencie.
Przykładowe projekty