J'ai un problème, que je n'ai aucune idée, comment résoudre. Dans mon composant de réaction, j'affiche une longue liste de données et quelques liens en bas. Après avoir cliqué sur l'un de ces liens, je remplis la liste avec une nouvelle collection de liens et je dois faire défiler vers le haut.
Le problème est - comment faire défiler vers le haut une fois la nouvelle collection rendue?
'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); }, []);
Remarque, vous pouvez également importer directement useEffect:import { useEffect } from 'react'
Étant donné que la solution d'origine a été fournie pour la toute première version de react , voici une mise à jour:
la source
ReactDOM.findDOMNode(this).scrollTop = 0
this is undefined in arrow functions
est incorrect. Le mot clé this est lié au même contexte que la fonction englobante developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...Vous pouvez utiliser quelque chose comme ça. ReactDom est pour react.14. Réagissez autrement.
Mise à jour du 11/05/2019 pour React 16+
la source
componentDidMount
est une autre alternative.Dans React Routing, il y a le problème que si nous redirigeons vers la nouvelle route, cela ne vous amènera pas automatiquement en haut de la page.
Même moi, j'ai eu le même problème.
Je viens d'ajouter la seule ligne à mon composant et cela a fonctionné comme du beurre.
Référer: formation de réaction
la source
Cela pourrait, et devrait probablement, être géré à l'aide de références :
Exemple de code:
la source
<div ref={(ref) => this._div = ref} />
dans le tout premier<div>
de ma déclaration de rendu. Le reste de mon rendu reste exactement le même.<div ref="main">
et ensuitethis.refs.main.scrollTop=0
Vous pouvez le faire dans le routeur comme ça:
Le
onUpdate={() => window.scrollTo(0, 0)}
mettre le haut de défilement. Pour plus d'informations, consultez: lien codepenla source
/somePage/:imgId
, elle défilera vers le haut: (. N'importe quelle manière de "contrôler" le déclenchement ou non l'événement onUpdate sur des routes / paramètres spécifiques?onUpdate
n'existe pas dans les accessoires de HashRouter ... Si quelqu'un rencontre le même problème: j'ai fini par utiliser la solution ScrollToTop décrite plus bas (et dans la documentation de react-router) qui fonctionnait parfaitement pour moi.Pour ceux qui utilisent des hooks, le code suivant fonctionnera.
Remarque, vous pouvez également importer directement useEffect:
import { useEffect } from 'react'
la source
[]
deuxième paramètre signifie que cela ne se produira que sur le premier rendu, avez-vous essayé sans?Voici encore une autre approche qui vous permet de choisir les composants montés sur lesquels vous souhaitez réinitialiser la position de défilement de la fenêtre sans dupliquer en masse le ComponentDidUpdate / ComponentDidMount.
L'exemple ci-dessous encapsule le composant Blog avec ScrollIntoView (), de sorte que si l'itinéraire change lorsque le composant Blog est monté, le ComponentDidUpdate du HOC met à jour la position de défilement de la fenêtre.
Vous pouvez tout aussi facilement l'envelopper sur l'ensemble de l'application, de sorte que lors de tout changement d'itinéraire, il déclenchera une réinitialisation de la fenêtre.
ScrollIntoView.js
Routes.js
L'exemple ci-dessus fonctionne très bien, mais si vous avez migré vers
react-router-dom
, vous pouvez simplifier ce qui précède en créant unHOC
qui encapsule le composant.Encore une fois, vous pouvez également l'envelopper tout aussi facilement sur vos routes (il suffit de changer la
componentDidMount
méthode en l'componentDidUpdate
exemple de code de méthode écrit ci-dessus, ainsi que de l'envelopperScrollIntoView
avecwithRouter
).conteneurs / ScrollIntoView.js
composants / Home.js
la source
C'est la seule chose qui a fonctionné pour moi (avec un composant de classe ES6):
la source
J'utilise le composant ScrollToTop de react-router dont le code est décrit dans la documentation de react-router
https://reacttraining.com/react-router/web/guides/scroll-restoration/scroll-to-top
Je change de code dans un seul fichier Routes et après cela, je n'ai pas besoin de changer de code dans chaque composant.
Exemple de code -
Étape 1 - Créez le composant ScrollToTop.js
Étape 2 - Dans le fichier App.js, ajoutez le composant ScrollToTop après
<Router
la source
Solution de crochet :
la source
Utilisation de crochets dans les composants fonctionnels, en supposant que le composant se met à jour lorsqu'il y a une mise à jour dans les accessoires de résultat
la source
use
Tout ce qui précède n'a pas fonctionné pour moi - je ne sais pas pourquoi mais:
travaillé, où HEADER est l'identifiant de mon élément d'en-tête
la source
Si tout le monde veut faire quelque chose de simple, voici une solution qui fonctionnera pour tout le monde
ajouter cette mini fonction
appeler la fonction comme suit depuis le pied de page de la page
si vous voulez ajouter de jolis styles, voici le css
la source
J'utilise React Hooks et je voulais quelque chose de réutilisable mais aussi quelque chose que je pourrais appeler à tout moment (plutôt que juste après le rendu).
Ensuite, pour utiliser le crochet, vous pouvez faire:
la source
Si vous faites cela pour mobile , au moins avec chrome, vous verrez une barre blanche en bas.
Cela se produit lorsque la barre d'URL disparaît. Solution:
Google Developer Docs
la source
Aucune des réponses ci-dessus ne fonctionne actuellement pour moi. Il s'avère que ce
.scrollTo
n'est pas aussi largement compatible que.scrollIntoView
.Dans notre App.js, dans
componentWillMount()
nous avons ajoutéC'est la seule solution qui fonctionne universellement pour nous. root est l'ID de notre application. Le comportement «fluide» ne fonctionne pas sur tous les navigateurs / appareils. Le délai d'attente 777 est un peu prudent, mais nous chargeons beaucoup de données sur chaque page, donc à travers des tests, cela était nécessaire. Un 237 plus court pourrait fonctionner pour la plupart des applications.
la source
J'ai rencontré ce problème en créant un site avec Gatsby dont le lien est construit au-dessus de Reach Router. Il semble étrange que ce soit une modification qui doit être faite plutôt que le comportement par défaut.
Quoi qu'il en soit, j'ai essayé plusieurs des solutions ci-dessus et la seule qui a réellement fonctionné pour moi était:
Je l'ai mis dans un useEffect mais vous pouvez tout aussi facilement le mettre dans componentDidMount ou le déclencher de toute autre manière que vous le souhaitez.
Je ne sais pas pourquoi window.scrollTo (0, 0) ne fonctionnerait pas pour moi (et pour les autres).
la source
Toutes les solutions parlent d'ajouter le scroll sur
componentDidMount
oucomponentDidUpdate
mais avec le DOM.J'ai fait tout cela et je n'ai pas travaillé.
Alors, j'ai trouvé une autre façon qui fonctionne très bien pour moi.
J'ai aussi trouvé quelque chose de ScrollRestoration , mais je suis paresseux maintenant. Et pour l'instant je vais le garder de la manière "DidUpdate".
J'espère que ça aide!
fais attention
la source
Ce code provoquera un comportement fluide sur le défilement :
Vous pouvez passer d'autres paramètres à l'intérieur de scrollIntoView () La syntaxe suivante peut être utilisée:
alignToTop Facultatif Est une valeur booléenne:
scrollIntoViewOptions Facultatif Est un objet avec les propriétés suivantes:
Plus de détails peuvent être trouvés ici: MDN docs
la source
Aucune des réponses ci-dessus ne fonctionne actuellement pour moi. Il s'avère que ce
.scrollTo
n'est pas aussi largement compatible que.scrollIntoView
.Dans notre App.js, dans
componentWillMount()
nous avons ajoutéC'est la seule solution qui fonctionne universellement pour nous.
root
est l'ID de notre application. Le comportement «fluide» ne fonctionne pas sur tous les navigateurs / appareils. Le délai d'attente 777 est un peu prudent, mais nous chargeons beaucoup de données sur chaque page, donc à travers des tests, cela était nécessaire. Un 237 plus court pourrait fonctionner pour la plupart des applications.la source
Si je suppose que vous rendez un chapitre, disons, un livre par page, tout ce que vous avez à faire est de l'ajouter à votre code. Cela a fonctionné pour moi comme par magie.
Avec cela, vous n'avez pas besoin de créer une référence sur le composant en cours de rendu.
la source
C'est ce que j'ai fait:
la source
Vous pouvez utiliser, cela fonctionne pour moi.
la source
Quelque chose comme ça a fonctionné pour moi sur un composant:
Ensuite, quelle que soit la fonction qui traite des mises à jour:
la source
Rien n'a fonctionné pour moi mais:
la source