En la versión actual de React Router (v3) puedo aceptar una respuesta del servidor y usarla browserHistory.push
para ir a la página de respuesta apropiada. Sin embargo, esto no está disponible en v4, y no estoy seguro de cuál es la forma adecuada de manejar esto.
En este ejemplo, usando Redux, components / app-product-form.js llama this.props.addProduct(props)
cuando un usuario envía el formulario. Cuando el servidor devuelve un éxito, el usuario es llevado a la página Carrito.
// actions/index.js
export function addProduct(props) {
return dispatch =>
axios.post(`${ROOT_URL}/cart`, props, config)
.then(response => {
dispatch({ type: types.AUTH_USER });
localStorage.setItem('token', response.data.token);
browserHistory.push('/cart'); // no longer in React Router V4
});
}
¿Cómo puedo hacer una redirección a la página del carrito desde la función React Router v4?
context
para pasar lo que necesita manualmente es un "no ir". A menos que sea un autor de biblioteca, no debería ser necesario usarlo. De hecho, Facebook recomienda no hacerlo.history
también funciona para React Native como una opción, además de una opción adicional de admitir navegadores heredados.Respuestas:
Puede usar los
history
métodos fuera de sus componentes. Intenta de la siguiente manera.Primero, cree un
history
objeto que use el paquete de historial :Luego envuélvalo
<Router>
( tenga en cuenta que debe usarlo enimport { Router }
lugar deimport { BrowserRouter as Router }
):Cambie su ubicación actual desde cualquier lugar, por ejemplo:
UPD : También puede ver un ejemplo ligeramente diferente en las Preguntas frecuentes de React Router .
fuente
history.push('some path')
, la URL cambia pero la página no cambia. Tengo que ponerlowindow.location.reload()
después en algunas partes de mi código solo para que funcione. Sin embargo, en un caso, tengo que mantener el árbol de estado redux, y la recarga lo destruye. ¿Alguna otra solución?withRouter
componente de orden superior.import createHistory from 'history/createBrowserHistory'; export default createHistory();
sea trabajo.React Router v4 es fundamentalmente diferente de v3 (y anterior) y no puede hacer lo
browserHistory.push()
que solía hacer.Esta discusión parece relacionada si quieres más información:
En cambio, tiene algunas opciones para hacer esto:
Utilizar el
withRouter
componente de alto ordenEn su lugar, debe usar el
withRouter
componente de orden superior y ajustarlo al componente que empujará al historial. Por ejemplo:Consulte la documentación oficial para más información:
Utilizar el
context
APIEl uso del contexto podría ser una de las soluciones más fáciles, pero al ser una API experimental, es inestable y no es compatible. Úselo solo cuando todo lo demás falla. Aquí hay un ejemplo:
Echa un vistazo a la documentación oficial sobre contexto:
fuente
this.context.router.history.push('/path');
Ahora con react-router v5 puede usar el enlace de ciclo de vida useHistory de esta manera:
Lea más en: https://reacttraining.com/react-router/web/api/Hooks/usehistory
fuente
let history = useHistory();
peroObject is not callable
obtengo un error cuando intenté ver qué uso tiene la historiaconsole.log(useHistory)
como indefinido. utilizando"react-router-dom": "^5.0.1"
La manera más simple en React Router 4 es usar
Pero para usar este método, su componente existente debe tener acceso al
history
objeto. Podemos acceder porSi su componente está vinculado
Route
directamente, entonces su componente ya tiene acceso ahistory
objeto.p.ej:
Aquí
ViewProfile
tiene acceso ahistory
.Si no está conectado a
Route
directamente.p.ej:
Entonces tenemos que usar
withRouter
una función de orden superior para deformar el componente existente.ViewUsers
Componente interiorimport { withRouter } from 'react-router-dom';
export default withRouter(ViewUsers);
Eso es todo, su
ViewUsers
componente tiene acceso ahistory
objeto.ACTUALIZAR
2
- en este escenario, pase toda la rutaprops
a su componente, y luego podremos accederthis.props.history
desde el componente incluso sin unHOC
p.ej:
fuente
this.props.history
) proviene de un HOC, lo que significa que no está directamente relacionado con elRoute
, como usted explica.Así es como lo hice:
Utilizar
this.props.history.push('/cart');
para redirigir a la página del carrito, se guardará en el objeto de historial.Disfruta, Michael.
fuente
De acuerdo con la documentación de React Router v4 - sesión de Redux Deep Integration
Se necesita una integración profunda para:
Sin embargo, recomiendan este enfoque como una alternativa a la "integración profunda":
Entonces puede envolver su componente con el componente de orden superior withRouter:
export default withRouter(connect(null, { actionCreatorName })(ReactComponent));
que pasará la API de historial a los accesorios. Entonces puedes llamar al creador de la acción pasando la historia como un parámetro. Por ejemplo, dentro de su ReactComponent:
Luego, dentro de tus acciones / index.js:
fuente
Pregunta desagradable, me llevó bastante tiempo, pero finalmente, lo resolví de esta manera:
Envuelva su contenedor con
withRouter
y pase el historial a su acción enmapDispatchToProps
función. En acción, use history.push ('/ url') para navegar.Acción:
Envase:
Esto es válido para reaccionar Router v4.x .
fuente
import { createBrowserHistory } from 'history'
alguna idea anterior , ¿por favor?this.context.history.push
no trabajará.Me las arreglé para empujar trabajando así:
fuente
En este caso, estás pasando accesorios a tu puño. Entonces puedes simplemente llamar
Si este no es el caso, aún puede pasar el historial de su componente
fuente
Ofrezco una solución más en caso de que valga la pena para otra persona.
Tengo un
history.js
archivo donde tengo lo siguiente:Luego, en mi raíz donde defino mi enrutador, uso lo siguiente:
Finalmente, en mi
actions.js
importo Historial y uso pushLaterDe esta manera, puedo impulsar nuevas acciones después de las llamadas a la API.
¡Espero eso ayude!
fuente
Si está usando Redux, entonces recomendaría usar el paquete npm react-router-redux . Le permite despachar acciones de navegación de la tienda Redux.
Debe crear la tienda como se describe en su archivo Léame .
El caso de uso más fácil:
Segundo caso de uso con contenedor / componente:
Envase:
Componente:
fuente
next
versión, que todavía está en desarrollo en este momento.Pude lograr esto usando
bind()
. Quería hacer clic en un botónindex.jsx
, publicar algunos datos en el servidor, evaluar la respuesta y redirigir asuccess.jsx
. Así es como lo resolví ...index.jsx
:request.js
:success.jsx
:Entonces, al vincularme
this
apostData
inindex.jsx
, pude accederthis.props.history
arequest.js
... luego puedo reutilizar esta función en diferentes componentes, solo tengo que asegurarme de recordar incluirthis.postData = postData.bind(this)
en elconstructor()
.fuente
Aquí está mi truco (este es mi archivo de nivel raíz, con un poco de redux mezclado allí, aunque no estoy usando
react-router-redux
):Luego puedo usarlo en
window.appHistory.push()
cualquier lugar que desee (por ejemplo, en mis funciones / thunks / sagas de la tienda redux, etc.) Esperaba poder usarlo,window.customHistory.push()
pero por alguna razónreact-router
nunca pareció actualizarse a pesar de que la URL cambió. Pero de esta manera tengo losreact-router
usos de instancia EXACT . No me encanta poner cosas en el ámbito global, y esta es una de las pocas cosas con las que haría eso. Pero es mejor que cualquier otra alternativa que haya visto en mi opinión.fuente
Usar devolución de llamada. ¡Funcionó para mí!
En el componente, solo tiene que agregar la devolución de llamada
fuente
así que la forma en que lo hago es: - en lugar de redirigir usando
history.push
, solo uso elRedirect
componente dereact-router-dom
Al usar este componente, puede pasarpush=true
y se encargará del restofuente
React router V4 ahora permite utilizar el accesorio de historial de la siguiente manera:
Se puede acceder al valor siempre que el accesorio de ubicación esté disponible como
state:{value}
estado no componente.fuente
puedes usarlo así como lo hago para iniciar sesión y muchas cosas diferentes
fuente
fuente
el primer paso envuelve tu aplicación en el enrutador
Ahora toda mi aplicación tendrá acceso a BrowserRouter. Paso dos importo Ruta y luego paso esos accesorios. Probablemente en uno de tus archivos principales.
Ahora, si ejecuto console.log (this.props) en mi archivo js de componente, debería obtener algo similar a esto
Paso 2 Puedo acceder al objeto de historial para cambiar mi ubicación
Además, solo soy un estudiante de bootcamp de codificación, así que no soy un experto, pero sé que también puedes usar
Corrígeme si me equivoco, pero cuando lo probé, volvió a cargar toda la página, lo que pensé que derrotó el punto de usar React.
fuente
Crea una costumbre
Router
con la suyabrowserHistory
:A continuación, en su raíz donde define su
Router
, use lo siguiente:Finalmente, importe
history
donde lo necesite y úselo:fuente
Si desea usar el historial al pasar una función como valor al accesorio de un Componente, con react-router 4 puede simplemente desestructurar el
history
accesorio en el atributo de renderizado del<Route/>
Componente y luego usarhistory.push()
Nota: Para que esto funcione, debe envolver el componente BrowserRouter de React Router alrededor de su componente raíz (por ejemplo, que podría estar en index.js)
fuente