javascript - link - redireccionar react
Enrutamiento del cliente(usando react-router) y enrutamiento del lado del servidor (2)
Con 1.0, React-Router depende del módulo de
history
como una dependencia de igual.
Este módulo se ocupa del enrutamiento en el navegador.
De forma predeterminada, React-Router usa la API de historial HTML5 (
pushState
,
replaceState
), pero puede configurarlo para usar el enrutamiento basado en hash (consulte a continuación)
El manejo de la ruta ahora se realiza detrás de escena y ReactRouter envía nuevos accesorios a los manejadores de ruta cuando la ruta cambia.
El enrutador tiene una nueva devolución de llamada de
onUpdate
cada vez que cambia una ruta, útil para el seguimiento de visitas a la página o para actualizar el
<title>
, por ejemplo.
Cliente (enrutamiento HTML5)
import {Router} from ''react-router''
import routes from ''./routes''
var el = document.getElementById(''root'')
function track(){
// ...
}
// routes can be children
render(<Router onUpdate={track}>{routes}</Router>, el)
Cliente (enrutamiento basado en hash)
import {Router} from ''react-router''
import {createHashHistory} from ''history''
import routes from ''./routes''
var el = document.getElementById(''root'')
var history = createHashHistory()
// or routes can be a prop
render(<Router routes={routes} history={history}></Router>, el)
Servidor
En el servidor, podemos usar
ReactRouter.match
, esto se toma de la
guía de representación del servidor
import { renderToString } from ''react-dom/server''
import { match, RoutingContext } from ''react-router''
import routes from ''./routes''
app.get(''*'', function(req, res) {
// Note that req.url here should be the full URL path from
// the original request, including the query string.
match({ routes, location: req.url }, (error, redirectLocation, renderProps) => {
if (error) {
res.status(500).send(error.message)
} else if (redirectLocation) {
res.redirect(302, redirectLocation.pathname + redirectLocation.search)
} else if (renderProps) {
res.status(200).send(renderToString(<RoutingContext {...renderProps} />))
} else {
res.status(404).send(''Not found'')
}
})
})
He estado pensando y estoy confundido con el enrutamiento entre Cliente y Servidor. Supongamos que uso ReactJS para la representación del lado del servidor antes de enviar la solicitud de vuelta al navegador web, y uso el enrutador de reacción como un enrutamiento del lado del cliente para cambiar de página sin actualizar como SPA.
Lo que viene a la mente es:
-
¿Cómo se interpretan las rutas?
Por ejemplo, una solicitud desde la página de inicio (
/home
) a la página de/posts
(/posts
) - ¿A dónde va el enrutamiento, en el lado del servidor o en el cliente?
- ¿Cómo sabe cómo se procesa?
Tenga en cuenta que esta respuesta cubre la versión 0.13.x de React Router: parece que la próxima versión 1.0 tendrá detalles de implementación significativamente diferentes
Servidor
Este es un
server.js
mínimo con 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})
})
})
Donde el módulo de
routes
exporta una lista de rutas:
var React = require(''react'')
var {DefaultRoute, NotFoundRoute, Route} = require(''react-router'')
module.exports = [
<Route path="/" handler={require(''./components/App'')}>
{/* ... */}
</Route>
]
Cada vez que se realiza una solicitud al servidor, se crea una instancia de
Router
un solo uso configurada con la URL entrante como su ubicación estática, que se resuelve en el árbol de rutas para configurar las rutas coincidentes apropiadas, llamando de nuevo con la parte superior controlador de ruta de nivel que se representará y un registro de las rutas secundarias coincidentes en cada nivel.
Esto es lo que se consulta cuando se usa el componente
<RouteHandler>
dentro de un componente de manejo de ruta para representar una ruta secundaria que coincidió.
Si el usuario tiene JavaScript desactivado, o se está cargando lentamente, cualquier enlace en el que haga clic volverá al servidor, lo que se resuelve nuevamente como se indicó anteriormente.
Cliente
Este es un
client.js
mínimo con react-router (reutilizando el mismo módulo de rutas):
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)
})
Cuando llama a
Router.run()
, crea una instancia de Router para usted detrás de escena, que se reutiliza cada vez que navega por la aplicación, ya que la URL puede ser dinámica en el cliente, a diferencia del servidor donde Una sola solicitud tiene una URL fija.
En este caso, estamos utilizando
HistoryLocation
, que utiliza la
API de
History
para asegurarse de que suceda lo correcto cuando presiona el botón Atrás / Adelante.
También hay un
HashLocation
que cambia el
hash
la URL para hacer entradas en el historial y escucha el evento
window.onhashchange
para activar la navegación.
Cuando usa el componente
<Link>
react-router, le da un prop a que es el nombre de una ruta, más cualquier
params
y datos de
query
que la ruta necesite.
El
<a>
representado por este componente tiene un controlador
onClick
que finalmente llama a
router.transitionTo()
en la instancia del enrutador con los accesorios que le dio el enlace, que se ve así:
/**
* 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);
}
},
Para un enlace regular, esto finalmente llama a
location.push()
en cualquier tipo de ubicación que esté utilizando, que maneja los detalles de la configuración del historial para que la navegación con los botones de retroceso y avance funcione, luego vuelve a
router.handleLocationChange()
al
router.handleLocationChange()
para informe al enrutador que puede continuar con la transición a la nueva ruta URL.
Luego, el enrutador llama a su propio método
router.dispatch()
con la nueva URL, que maneja los detalles para determinar cuál de las rutas configuradas coincide con la URL, luego llama a todos
los ganchos de transición
presentes para las rutas coincidentes.
Puede implementar estos ganchos de transición en cualquiera de sus controladores de ruta para tomar alguna acción cuando una ruta está a punto de ser alejada o navegada, con la capacidad de abortar la transición si las cosas no son de su agrado.
Si no se
Router.run()
la transición, el paso final es llamar a la devolución de llamada que le dio a
Router.run()
con el componente controlador de nivel superior y un objeto de estado con todos los detalles de la URL y las rutas coincidentes.
El componente del controlador de nivel superior es en realidad la instancia del
Router
sí, que maneja la representación del controlador de ruta más superior que coincidió.
El proceso anterior se vuelve a ejecutar cada vez que navega a una nueva URL en el cliente.