Tengo un problema, que no tengo ideas, cómo resolverlo. En mi componente reaccionar, muestro una larga lista de datos y pocos enlaces en la parte inferior. Después de hacer clic en cualquiera de estos enlaces, completo la lista con una nueva colección de enlaces y necesito desplazarme hacia la parte superior.
El problema es: ¿cómo desplazarse a la parte superior después de que se procese la nueva colección?
'use strict';
// url of this component is #/:checklistId/:sectionId
var React = require('react'),
Router = require('react-router'),
sectionStore = require('./../stores/checklist-section-store');
function updateStateFromProps() {
var self = this;
sectionStore.getChecklistSectionContent({
checklistId: this.getParams().checklistId,
sectionId: this.getParams().sectionId
}).then(function (section) {
self.setState({
section,
componentReady: true
});
});
this.setState({componentReady: false});
}
var Checklist = React.createClass({
mixins: [Router.State],
componentWillMount: function () {
updateStateFromProps.call(this);
},
componentWillReceiveProps(){
updateStateFromProps.call(this);
},
render: function () {
if (this.state.componentReady) {
return(
<section className='checklist-section'>
<header className='section-header'>{ this.state.section.name } </header>
<Steps steps={ this.state.section.steps }/>
<a href=`#/${this.getParams().checklistId}/${this.state.section.nextSection.Id}`>
Next Section
</a>
</section>
);
} else {...}
}
});
module.exports = Checklist;
React.useEffect(() => { window.scrollTo(0, 0); }, []);
Tenga en cuenta que también puede importar useEffect directamente:import { useEffect } from 'react'
Dado que la solución original se proporcionó para una versión muy temprana de react , aquí hay una actualización:
fuente
ReactDOM.findDOMNode(this).scrollTop = 0
this is undefined in arrow functions
Es incorrecto. La palabra clave this está vinculada al mismo contexto que la función adjunta developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Podrías usar algo como esto. ReactDom es para reaccionar.14. Solo reacciona de otra manera.
Actualización 5/11/2019 para React 16+
fuente
componentDidMount
es otra alternativa.En React Routing existe el problema de que si redirigimos a la nueva ruta, no lo llevará automáticamente a la parte superior de la página.
Incluso yo tuve el mismo problema.
Acabo de agregar una sola línea a mi componente y funcionó como la mantequilla.
Consulte: reaccionar entrenamiento
fuente
Esto podría, y probablemente debería, manejarse usando referencias :
Código de ejemplo:
fuente
<div ref={(ref) => this._div = ref} />
primero<div>
de mi declaración de render. El resto de mi render permanece exactamente igual.<div ref="main">
y luegothis.refs.main.scrollTop=0
Puede hacer esto en el enrutador así:
El
onUpdate={() => window.scrollTo(0, 0)}
poner el pergamino superior. Para más información consultar: enlace codepenfuente
/somePage/:imgId
, se desplazará hacia arriba :(. Cualquier forma de "controlar" si disparar o no el evento onUpdate en rutas / parámetros específicos?onUpdate
no existe en los accesorios de HashRouter ... Si alguien encuentra el mismo problema: terminé usando la solución ScrollToTop descrita más abajo (y en los documentos react-router) que funcionó perfectamente para mí.Para aquellos que usan ganchos, el siguiente código funcionará.
Tenga en cuenta que también puede importar useEffect directamente:
import { useEffect } from 'react'
fuente
[]
segundo parámetro significa que solo sucederá en el primer renderizado, ¿lo has intentado sin él?Aquí hay otro enfoque que le permite elegir a qué componentes montados desea restablecer la posición de desplazamiento de la ventana sin duplicar en masa ComponentDidUpdate / ComponentDidMount.
El siguiente ejemplo está envolviendo el componente Blog con ScrollIntoView (), de modo que si la ruta cambia cuando se monta el componente Blog, ComponentDidUpdate del HOC actualizará la posición de desplazamiento de la ventana.
Puede envolverlo fácilmente en toda la aplicación, de modo que en cualquier cambio de ruta, se activará un reinicio de la ventana.
ScrollIntoView.js
Routes.js
El ejemplo anterior funciona muy bien, pero si ha migrado a
react-router-dom
, entonces puede simplificar lo anterior creando unHOC
que envuelva el componente.Una vez más, también podría envolverlo con la misma facilidad en sus rutas (simplemente cambie el
componentDidMount
método alcomponentDidUpdate
código de ejemplo del método escrito anteriormente, así como envolverScrollIntoView
conwithRouter
).contenedores / ScrollIntoView.js
componentes / Home.js
fuente
Esto es lo único que funcionó para mí (con un componente de clase ES6):
fuente
Estoy usando el componente ScrollToTop de react-router cuyo código se describe en los documentos de react-router
https://reacttraining.com/react-router/web/guides/scroll-restoration/scroll-to-top
Estoy cambiando el código en un solo archivo de rutas y después de eso no es necesario cambiar el código en cada componente.
Código de ejemplo -
Paso 1: crea el componente ScrollToTop.js
Paso 2: en el archivo App.js, agregue el componente ScrollToTop después de
<Router
fuente
Solución de gancho :
fuente
Uso de ganchos en componentes funcionales, asumiendo las actualizaciones de los componentes cuando hay una actualización en los accesorios de resultados
fuente
use
Todo lo anterior no funcionó para mí, no estoy seguro de por qué, pero:
trabajado, donde HEADER es la identificación de mi elemento de encabezado
fuente
Si todo lo que quieres hacer es algo simple, aquí hay una solución que funcionará para todos
agrega esta mini función
llame a la función como sigue desde el pie de página de la página
si quieres agregar estilos agradables aquí está el CSS
fuente
Estoy usando React Hooks y quería algo reutilizable, pero también algo que pudiera llamar en cualquier momento (en lugar de solo después de renderizar).
Luego, para usar el gancho puedes hacer:
fuente
Si está haciendo esto para dispositivos móviles , al menos con Chrome, verá una barra blanca en la parte inferior.
Esto sucede cuando la barra de URL desaparece. Solución:
Documentos para desarrolladores de Google
fuente
Ninguna de las respuestas anteriores está funcionando actualmente para mí. Resulta que
.scrollTo
no es tan ampliamente compatible como.scrollIntoView
.En nuestro App.js,
componentWillMount()
agregamosEsta es la única solución que funciona universalmente para nosotros. root es la ID de nuestra aplicación. El comportamiento "fluido" no funciona en todos los navegadores / dispositivos. El tiempo de espera del 777 es un poco conservador, pero cargamos una gran cantidad de datos en cada página, por lo que fue necesario realizar pruebas. Un 237 más corto podría funcionar para la mayoría de las aplicaciones.
fuente
Me encontré con este problema al construir un sitio con Gatsby cuyo enlace se basa en Reach Router. Parece extraño que se trate de una modificación que debe realizarse en lugar del comportamiento predeterminado.
De todos modos, probé muchas de las soluciones anteriores y la única que realmente funcionó para mí fue:
Puse esto en useEffect, pero podría ponerlo fácilmente en componentDidMount o activarlo de cualquier otra manera que lo desee.
No estoy seguro de por qué window.scrollTo (0, 0) no funcionaría para mí (y para otros).
fuente
Todas las soluciones hablan de agregar el desplazamiento en
componentDidMount
ocomponentDidUpdate
pero con el DOM.Hice todo eso y no funcionó.
Entonces, descubrí otra forma que funciona bien para mí.
También encontré algo sobre ScrollRestoration , pero ahora soy vago. Y por ahora lo mantendré en la forma "DidUpdate".
¡Espero eso ayude!
cuidate
fuente
Este código causará un comportamiento suave en el desplazamiento :
Puede pasar otros parámetros dentro de scrollIntoView () Se puede usar la siguiente sintaxis:
alignToTop Opcional es un valor booleano:
scrollIntoViewOptions Opcional Es un objeto con las siguientes propiedades:
Más detalles se pueden encontrar aquí: documentos de MDN
fuente
Ninguna de las respuestas anteriores está funcionando actualmente para mí. Resulta que
.scrollTo
no es tan ampliamente compatible como.scrollIntoView
.En nuestro App.js,
componentWillMount()
agregamosEsta es la única solución que funciona universalmente para nosotros.
root
es la identificación de nuestra aplicación. El comportamiento "fluido" no funciona en todos los navegadores / dispositivos. El tiempo de espera del 777 es un poco conservador, pero cargamos una gran cantidad de datos en cada página, por lo que fue necesario realizar pruebas. Un 237 más corto podría funcionar para la mayoría de las aplicaciones.fuente
Si supongo que está representando un capítulo de say, un libro por página, todo lo que necesita hacer es agregar esto a su código. Esto funcionó para mí como magia.
Con esto, no tiene necesidad de crear una referencia en el componente que se está representando.
fuente
Esto es lo que hice:
fuente
Puedes usar, esto funciona para mí.
fuente
Algo como esto me funcionó en un componente:
Luego, en cualquier función que se trate de actualizaciones:
fuente
Nada funcionó para mí pero:
fuente