le routeur de réaction fait défiler vers le haut sur chaque transition
J'ai un problème lors de la navigation dans une autre page, sa position restera comme la page d'avant. Alors il l'habitude de faire défiler vers le haut automatiquement.
J'ai aussi essayé d'utiliser window.scrollTo(0, 0)
sur onChange routeur. J'ai aussi utilisé scrollBehavior pour résoudre ce problème, mais cela n'a pas fonctionné. Toute suggestion à ce sujet?
source d'informationauteur adrian hartanto
Vous devez vous connecter pour publier un commentaire.
Cette réponse est pour le code de legs, pour le routeur v4+ chèque d'autres réponses
Si cela ne fonctionne pas, vous devez trouver la raison. Aussi à l'intérieur de
componentDidMount
vous pouvez utiliser:
vous pouvez ajouter quelques drapeaux comme "défile = false" et ensuite dans la mise à jour:
La documentation pour Réagir Routeur v4 contient des exemples de code pour faire défiler la restauration. Voici leur premier exemple de code, qui sert à l'échelle du site solution pour “faire défiler vers le haut” lorsqu'une page est accédée à:
Puis rendre en haut de votre application, mais en dessous de Routeur:
^ copié directement à partir de la documentation
Évidemment, cela fonctionne pour la plupart des cas, mais il est plus sur la façon de traiter avec des onglets interfaces et pourquoi une solution générique n'a pas été mis en œuvre.
Pour réagir-routeur v4ici, est de créer de réaction-app qui permet le défilement de la restauration: http://router-scroll-top.surge.sh/.
Pour ce faire, vous pouvez créer, décorer le
Route
composant et l'effet de levier du cycle de vie des méthodes:Sur le
componentDidUpdate
nous pouvons vérifier si l'emplacement du chemin d'accès changements et le faire correspondre à lapath
prop et, si ceux-ci satisfait, restaurer la fenêtre de défilement.Ce qui est cool à propos de cette approche, est que nous pouvons avoir itinéraires de restauration de défilement et les routes qui ne sont pas de restauration de défilement.
Voici un
App.js
exemple de la façon dont vous pouvez utiliser le haut:Du code ci-dessus, ce qui est intéressant à souligner est que de seulement lors de la navigation à
/about
ou/another-page
la faire défiler vers le haut d'action sera exécuté. Cependant, quand on va sur/
pas de scroll de restauration qui va arriver.L'ensemble de la base de code peut être trouvé ici: https://github.com/rizedr/react-router-scroll-top
J'ai eu le même problème avec mon application.À l'aide de l'extrait de code ci-dessous m'a aidé à faire défiler vers le haut de la page cliquez sur le bouton suivant.
Cependant, le problème persistait sur navigateur. Après beaucoup d'essais, on a réalisé que ce était à cause de la fenêtre du navigateur de l'histoire de l'objet, qui a une propriété scrollRestoration qui a été défini sur auto.Le réglage de ce manuel a résolu mon problème.
J'ai écrit un Ordre Supérieur Composant appelé
withScrollToTop
. Cette HOC prend dans les deux drapeaux:onComponentWillMount
- Que ce soit pour faire défiler vers le haut lors de la navigation (componentWillMount
)onComponentDidUpdate
- Que ce soit pour faire défiler vers le haut lors de la mise à jour (componentDidUpdate
). Ce drapeau est nécessaire, dans le cas où le composant est pas démonté, mais une de navigation de l'événement se produit, par exemple, à partir de/users/1
à/users/2
.Pour l'utiliser:
Voici une autre méthode.
Pour réagir-routeur v4 vous pouvez également lier un écouteur de changement dans l'histoire de l'événement, de la manière suivante:
Le défilement niveau sera fixé à 0 sans
setImmediate()
trop si l'itinéraire est modifié en cliquant sur un lien, mais si l'utilisateur appuie sur le bouton de retour du navigateur, alors il ne fonctionnera pas comme navigateur réinitialiser le défilement niveau manuellement le niveau précédent lorsque le dos est enfoncé, l'aide de l'setImmediate()
à cause de nous, notre fonction est exécutée lorsque le navigateur est terminé la réinitialisation du défilement niveau nous donnant l'effet désiré.J'ai trouvé que
ReactDOM.findDomNode(this).scrollIntoView()
est de travail. Je l'ai placé à l'intérieur decomponentDidMount()
.C'est hacky (mais qui fonctionne): je viens de l'ajouter
fenêtre.scrollTo(0,0);
à render();