Beachten Sie, dass diese Antwort die React Router-Version 0.13.x abdeckt. Die kommende Version 1.0 scheint deutlich andere Implementierungsdetails zu haben
Server
Dies ist ein Minimum server.js
bei React-Router:
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})
})
})
Wo das routes
Modul eine Liste von Routen exportiert:
var React = require('react')
var {DefaultRoute, NotFoundRoute, Route} = require('react-router')
module.exports = [
<Route path="/" handler={require('./components/App')}>
{/* ... */}
</Route>
]
Jedes Mal, wenn eine Anforderung an den Server gesendet wird, erstellen Sie eine Router
Einweginstanz, die mit der eingehenden URL als statischem Speicherort konfiguriert ist. Diese wird anhand des Routenbaums aufgelöst, um die entsprechenden übereinstimmenden Routen einzurichten, und ruft mit der obersten Ebene zurück Routenhandler, der gerendert werden soll, und Aufzeichnung, welche untergeordneten Routen auf jeder Ebene übereinstimmen. Dies wird empfohlen, wenn Sie die <RouteHandler>
Komponente innerhalb einer Routenbehandlungskomponente verwenden, um eine untergeordnete Route zu rendern, die übereinstimmt.
Wenn der Benutzer JavaScript deaktiviert hat oder das Laden langsam ist, werden alle Links, auf die er klickt, erneut auf den Server übertragen, was wie oben beschrieben erneut behoben wird.
Klient
Dies ist ein Minimum client.js
bei React-Router (Wiederverwendung des gleichen Routenmoduls):
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)
})
Wenn Sie anrufen Router.run()
, wird hinter den Kulissen eine Router-Instanz für Sie erstellt, die bei jeder Navigation in der App wiederverwendet wird, da die URL auf dem Client dynamisch sein kann und nicht auf dem Server, auf dem eine einzelne Anforderung eine hat feste URL.
In diesem Fall verwenden wir die HistoryLocation
, die die History
API verwendet , um sicherzustellen, dass das Richtige passiert, wenn Sie auf die Schaltfläche Zurück / Vorwärts klicken. Es gibt auch eine, HashLocation
die die URL ändert hash
, um Verlaufseinträge vorzunehmen, und das window.onhashchange
Ereignis abhört, um die Navigation auszulösen.
Wenn Sie reagieren-Router verwenden <Link>
Komponente, geben Sie ihm eine to
Stütze , die den Namen einer Route ist, sowie alle params
und query
die Routen Daten benötigt. Das <a>
von dieser Komponente gerenderte hat einen onClick
Handler, der letztendlich router.transitionTo()
die Router-Instanz mit den Requisiten aufruft, die Sie dem Link gegeben haben. Das sieht folgendermaßen aus:
/**
* 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);
}
},
Bei einer regulären Verbindung wird letztendlich der location.push()
von Ihnen verwendete Standorttyp aufgerufen, der die Details zum Einrichten des Verlaufs behandelt, sodass die Navigation mit den Schaltflächen "Zurück" und "Vorwärts" funktioniert. Anschließend wird zurückgerufen router.handleLocationChange()
, um dem Router mitzuteilen, dass der Übergang zu fortgesetzt werden kann der neue URL-Pfad.
Der Router ruft dann seine eigene router.dispatch()
Methode mit der neuen URL auf, die die Details zum Bestimmen festlegt, welche der konfigurierten Routen mit der URL übereinstimmen, und ruft dann alle für die übereinstimmenden Routen vorhandenen Übergangshooks auf. Sie können diese Übergangshooks in jedem Ihrer Routenhandler implementieren, um Maßnahmen zu ergreifen, wenn eine Route entfernt oder navigiert werden soll. Sie können den Übergang abbrechen, wenn die Dinge nicht Ihren Wünschen entsprechen.
Wenn der Übergang nicht abgebrochen wurde, besteht der letzte Schritt darin, den Rückruf aufzurufen, den Sie Router.run()
mit der Handlerkomponente der obersten Ebene und einem Statusobjekt mit allen Details der URL und den übereinstimmenden Routen erhalten haben. Die Handlerkomponente der obersten Ebene ist eigentlich die Router
Instanz selbst, die das Rendern des obersten Routenhandlers übernimmt, der abgeglichen wurde.
Der obige Vorgang wird jedes Mal erneut ausgeführt, wenn Sie zu einer neuen URL auf dem Client navigieren.
Beispielprojekte