Tengo un problema al navegar a otra página, su posición permanecerá como la página anterior. Por lo que no se desplazará hacia la parte superior automáticamente. También intenté usar window.scrollTo(0, 0)
en el enrutador onChange. También utilicé scrollBehavior para solucionar este problema, pero no funcionó. ¿Alguna sugerencia sobre esto?
javascript
reactjs
react-router
react-router-redux
adrian hartanto
fuente
fuente
componentDidMount
del componente de la nueva ruta?document.body.scrollTop = 0;
en elcomponentDidMount
del componente que se está mudandoRespuestas:
La documentación de React Router v4 contiene ejemplos de código para la restauración de scroll. Aquí está su primer ejemplo de código, que sirve como una solución en todo el sitio para "desplazarse hasta la parte superior" cuando se navega a una página:
Luego renderícelo en la parte superior de su aplicación, pero debajo del enrutador:
^ copiado directamente de la documentación
Obviamente, esto funciona para la mayoría de los casos, pero hay más información sobre cómo tratar las interfaces con pestañas y por qué no se ha implementado una solución genérica.
fuente
Because browsers are starting to handle the “default case” and apps have varying scrolling needs (like this website!), we don’t ship with default scroll management. This guide should help you implement whatever scrolling needs you have.
me entristece, porque todas las opciones para las que continúan dando ejemplos de código podrían integrarse en el control a través de la configuración de propiedades, con algunas convenciones sobre el comportamiento predeterminado que luego se pueden cambiar. Esto se siente súper hacky e inacabado, en mi humilde opinión. Significa que solo los desarrolladores avanzados de Reacción pueden hacer el enrutamiento correctamente y no #pitOfSuccesswork-arounds
aquí han ignorado. +100 para @danielnixonpero las clases son tan 2018
Implementación de ScrollToTop con React Hooks
ScrollToTop.js
Uso:
ScrollToTop también se puede implementar como un componente contenedor:
ScrollToTop.js
Uso:
fuente
scrollToTop
a<Route>
. Parece ser una característica de uso muy frecuente.action !== 'POP'
. El oyente acepta la acción comoEsta respuesta es para código heredado, para enrutador v4 + verifique otras respuestas
Si no funciona, debe encontrar la razón. Tambien adentro
componentDidMount
podrías usar:
podría agregar alguna bandera como "scrolled = false" y luego en la actualización:
fuente
window.scrollTo(0,0);
onUpdate
hook está obsoleto en react-router v4 - solo quiero señalar esoonUpdate
gancho?Para react-router v4 , aquí hay una aplicación create-react-app que logra la restauración del desplazamiento: http://router-scroll-top.surge.sh/ .
Para lograr esto, puede crear decorar el
Route
componente y aprovechar los métodos del ciclo de vida:En el
componentDidUpdate
podemos verificar cuándo cambia el nombre de ruta de ubicación y hacer coincidirlo con elpath
propiedad y, si están satisfechos, restaurar el desplazamiento de la ventana.Lo bueno de este enfoque es que podemos tener rutas que restauran el desplazamiento y rutas que no restauran el desplazamiento.
A continuación, se
App.js
muestra un ejemplo de cómo puede utilizar lo anterior:Del código anterior, lo que es interesante señalar es que solo al navegar hacia
/about
o se realizará/another-page
la acción de desplazamiento hacia arriba. Sin embargo, al continuar/
no se producirá ninguna restauración de desplazamiento.El código base completo se puede encontrar aquí: https://github.com/rizedr/react-router-scroll-top
fuente
Home
. Ahora desplácese hasta la parte inferior delHome
y ahora vaya a 'Otra página' y no se desplace. Ahora, si vuelve aHome
, esta página se desplazará hasta la parte superior. Pero de acuerdo con su respuesta, lahome
página debe mantenerse desplazada.Es de notar que el
onUpdate={() => window.scrollTo(0, 0)}
método está desactualizado.Aquí hay una solución simple para react-router 4+.
fuente
#
y?
al final de nuestra URL. En el primer caso, debe desplazarse no hacia la parte superior, en el segundo caso, no debe desplazarse en absolutoSi está ejecutando React 16.8+, esto es sencillo de manejar con un componente que desplazará la ventana hacia arriba en cada navegación:
Aquí está en el componente scrollToTop.js
Luego renderícelo en la parte superior de su aplicación, pero debajo de Router
Here está en app.js
o en index.js
fuente
Tuve el mismo problema con mi aplicación. El uso del siguiente fragmento de código me ayudó a desplazarme a la parte superior de la página al hacer clic en el siguiente botón.
Sin embargo, el problema persistía en la parte posterior del navegador. Después de muchas pruebas, me di cuenta de que esto se debía al objeto del historial de la ventana del navegador, que tiene una propiedad scrollRestoration que se configuró en auto. Establecer esto en manual resolvió mi problema.
fuente
En un componente a continuación
<Router>
Simplemente agregue un React Hook (en caso de que no esté usando una clase React)
fuente
Quiero compartir mi solución para aquellos que están usando,
react-router-dom v5
ya que ninguna de estas soluciones v4 hizo el trabajo por mí.Lo que resolvió mi problema fue instalar react-router-scroll-top y poner la envoltura de
<App />
esta manera:¡y eso es! ¡funcionó!
fuente
Los hooks son componibles, y desde React Router v5.1 tenemos un
useHistory()
hook. Entonces, basado en la respuesta de @ zurfyx, he creado un gancho reutilizable para esta funcionalidad:fuente
Un React Hook que puede agregar a su componente de ruta. Utilizando en
useLayoutEffect
lugar de oyentes personalizados.Actualización : actualizado para usar en
useLayoutEffect
lugar deuseEffect
, para un jank menos visual. Aproximadamente esto se traduce en:useEffect
: renderizar componentes -> pintar en pantalla -> desplazarse hacia arriba (ejecutar efecto)useLayoutEffect
: renderizar componentes -> desplazarse hacia arriba (ejecutar efecto) -> pintar en pantallaDependiendo de si está cargando datos (piense en hilanderos) o si tiene animaciones de transición de página,
useEffect
puede funcionar mejor para usted.fuente
Mi solución: un componente que estoy usando en mis componentes de pantallas (donde quiero un desplazamiento hacia arriba).
Esto conserva la posición de desplazamiento al retroceder. Usar useEffect () tuvo errores para mí, cuando retrocedía, el documento se desplazaba hacia la parte superior y también tenía un efecto de parpadeo cuando se cambiaba la ruta en un documento ya desplazado.
fuente
Reaccionar ganchos 2020 :)
fuente
const ScrollToTop: React.FC = () => {
No entiendo lo queScrollToTop: React.FC
significaEscribí un componente de orden superior llamado
withScrollToTop
. Este HOC tiene dos banderas:onComponentWillMount
- Ya sea para desplazarse hacia arriba en la navegación (componentWillMount
)onComponentDidUpdate
- Si desea desplazarse hacia arriba al actualizar (componentDidUpdate
). Esta bandera es necesaria en los casos en los que el componente no está desmontado pero se produce un evento de navegación, por ejemplo, de/users/1
a/users/2
.Para usarlo:
fuente
Aquí hay otro método.
Para react-router v4 , también puede vincular un oyente para cambiar el evento del historial, de la siguiente manera:
El nivel de desplazamiento se establecerá en 0 sin
setImmediate()
también si la ruta se cambia haciendo clic en un enlace, pero si el usuario presiona el botón Atrás en el navegador, no funcionará ya que el navegador restablece el nivel de desplazamiento manualmente al nivel anterior cuando se presiona el botón Atrás. , por lo que al usarsetImmediate()
hacemos que nuestra función se ejecute después de que el navegador termine de restablecer el nivel de desplazamiento, nos dará el efecto deseado.fuente
con React router dom v4 puedes usar
cree un componente scrollToTopComponent como el siguiente
o si está usando pestañas, use algo como el siguiente
espero que esta ayuda para más información sobre la restauración de desplazamiento vist hay documentos liebre reaccionan restauración de desplazamiento dom enrutador
fuente
Descubrí que
ReactDOM.findDomNode(this).scrollIntoView()
está funcionando. Lo puse dentrocomponentDidMount()
.fuente
Para aplicaciones más pequeñas, con 1-4 rutas, puede intentar piratearlo con redirección al elemento DOM superior con #id en lugar de solo una ruta. Entonces no hay necesidad de ajustar Rutas en ScrollToTop o usar métodos de ciclo de vida.
fuente
En su
router.js
, simplemente agregue esta función en elrouter
objeto. Esto hará el trabajo.Me gusta esto,
**Routes.js**
fuente
Puede ser una solución simple en caso de que no se cambien los accesorios y no se active componentDidUpdate ().
fuente
Esto es hacky (pero funciona): solo agrego
window.scrollTo (0,0);
renderizar ();
fuente