J'ai un problème lors de la navigation dans une autre page, sa position restera comme la page précédente. Donc, il ne défilera pas automatiquement vers le haut. J'ai également essayé d'utiliser window.scrollTo(0, 0)
sur le routeur onChange. J'ai également utilisé scrollBehavior pour résoudre ce problème mais cela n'a pas fonctionné. Une suggestion à ce sujet?
javascript
reactjs
react-router
react-router-redux
adrian hartanto
la source
la source
componentDidMount
le composant de la nouvelle route?document.body.scrollTop = 0;
aucomponentDidMount
du composant que vous vous déplacez àRéponses:
La documentation de React Router v4 contient des exemples de code pour la restauration du scroll. Voici leur premier exemple de code, qui sert de solution à l'échelle du site pour «faire défiler vers le haut» lorsque vous accédez à une page:
Ensuite, affichez-le en haut de votre application, mais sous le routeur:
^ copié directement depuis la documentation
Évidemment, cela fonctionne dans la plupart des cas, mais il y a plus sur la façon de traiter les interfaces à onglets et pourquoi une solution générique n'a pas été implémentée.
la source
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 rend triste, car toutes les options pour lesquelles ils donnent des exemples de code pourraient en fait être intégrées au contrôle via les paramètres de propriété, avec certaines conventions autour du comportement par défaut qui peuvent ensuite être modifiées. Cela semble super hacky et inachevé, à mon humble avis. Signifie que seuls les développeurs de réactions avancés peuvent effectuer le routage correctement et pas de #pitOfSuccesswork-arounds
ici ont ignorés. +100 pour @danielnixonmais les cours sont tellement 2018
Implémentation ScrollToTop avec React Hooks
ScrollToTop.js
Usage:
ScrollToTop peut également être implémenté en tant que composant wrapper:
ScrollToTop.js
Usage:
la source
scrollToTop
à<Route>
. Cela semble être une fonctionnalité très fréquemment utilisée.action !== 'POP'
. Listener accept action asCette réponse concerne le code hérité, pour le routeur v4 + vérifiez les autres réponses
Si cela ne fonctionne pas, vous devriez trouver la raison. Aussi à l'intérieur
componentDidMount
vous pouvez utiliser:
vous pouvez ajouter un indicateur comme "scrolled = false" puis dans la mise à jour:
la source
window.scrollTo(0,0);
onUpdate
hook est obsolète dans react-router v4 - je veux juste le souligneronUpdate
hook?Pour react-router v4 , voici une application create-react-app qui réalise la restauration du scroll: http://router-scroll-top.surge.sh/ .
Pour ce faire, vous pouvez créer une décoration du
Route
composant et tirer parti des méthodes de cycle de vie:Sur le,
componentDidUpdate
nous pouvons vérifier quand le chemin de l'emplacement change et le faire correspondre à l'path
accessoire et, si ceux-ci sont satisfaits, restaurer le défilement de la fenêtre.Ce qui est cool avec cette approche, c'est que nous pouvons avoir des routes qui restaurent le défilement et des routes qui ne restaurent pas le défilement.
Voici un
App.js
exemple de la façon dont vous pouvez utiliser ce qui précède:À partir du code ci-dessus, il est intéressant de souligner que ce n'est que lors de la navigation vers
/about
ou que/another-page
l'action de défilement vers le haut sera préformée. Cependant, lorsque vous continuez,/
aucune restauration de défilement n'aura lieu.La base de code entière peut être trouvée ici: https://github.com/rizedr/react-router-scroll-top
la source
Home
. Maintenant,Home
faites défiler vers le bas de et maintenant allez à 'AnotherPage' et ne faites pas défiler. Maintenant, si vous revenez àHome
, cette page défilera vers le haut. Mais selon votre réponse, lahome
page devrait continuer à défiler.Il est à noter que la
onUpdate={() => window.scrollTo(0, 0)}
méthode est obsolète.Voici une solution simple pour react-router 4+.
la source
#
et?
à la fin de notre URL. Dans le premier cas, vous devriez faire défiler non vers le haut dans le second cas, vous ne devriez pas faire défiler du toutSi vous exécutez React 16.8+, cela est simple à gérer avec un composant qui fera défiler la fenêtre vers le haut à chaque navigation:
Voici le composant scrollToTop.js
Ensuite, rendez-le en haut de votre application, mais en dessous du routeur
Voici dans app.js
ou dans index.js
la source
J'ai eu le même problème avec mon application.L'utilisation de l'extrait de code ci-dessous m'a aidé à faire défiler vers le haut de la page en cliquant sur le bouton suivant.
Cependant, le problème persistait toujours au retour du navigateur. Après de nombreux essais, j'ai réalisé que c'était à cause de l'objet historique de la fenêtre du navigateur, qui a une propriété scrollRestoration qui était définie sur auto.
la source
Dans un composant ci-dessous
<Router>
Ajoutez simplement un Hook React (au cas où vous n'utilisez pas de classe React)
la source
Je souhaite partager ma solution pour ceux qui l'utilisent
react-router-dom v5
car aucune de ces solutions v4 n'a fait le travail à ma place.Ce qui a résolu mon problème a été d'installer react-router-scroll-top et de mettre le wrapper
<App />
comme ceci:et c'est tout! ça a marché!
la source
Les hooks sont composables, et depuis React Router v5.1 nous avons un
useHistory()
hook. Donc, basé sur la réponse de @ zurfyx, j'ai créé un hook réutilisable pour cette fonctionnalité:la source
Un Hook React que vous pouvez ajouter à votre composant Route. Utilisation
useLayoutEffect
au lieu d'écouteurs personnalisés.Mise à jour : mise à jour pour utiliser à la
useLayoutEffect
place deuseEffect
, pour moins de jank visuel. Cela se traduit en gros par:useEffect
: rendre les composants -> peindre à l'écran -> faire défiler vers le haut (effet d'exécution)useLayoutEffect
: rendre les composants -> faire défiler vers le haut (effet d'exécution) -> peindre à l'écranSelon que vous chargez des données (pensez aux spinners) ou si vous avez des animations de transition de page, cela
useEffect
peut fonctionner mieux pour vous.la source
Ma solution: un composant que j'utilise dans mes composants d'écrans (où je souhaite faire défiler vers le haut).
Cela préserve la position de défilement lors du retour. Utiliser useEffect () était bogué pour moi, lorsque je revenais en arrière, le document défilait vers le haut et avait également un effet de clignotement lorsque la route était modifiée dans un document déjà défilé.
la source
React hooks 2020 :)
la source
const ScrollToTop: React.FC = () => {
Je ne comprends pas ce queScrollToTop: React.FC
signifieJ'ai écrit un composant d'ordre supérieur appelé
withScrollToTop
. Ce HOC comprend deux drapeaux:onComponentWillMount
- Défilement vers le haut lors de la navigation (componentWillMount
)onComponentDidUpdate
- Défilement vers le haut lors de la mise à jour (componentDidUpdate
). Cet indicateur est nécessaire dans les cas où le composant n'est pas démonté mais qu'un événement de navigation se produit, par exemple, de/users/1
à/users/2
.Pour l'utiliser:
la source
Voici une autre méthode.
Pour react-router v4, vous pouvez également lier un auditeur au changement d'événement d'historique, de la manière suivante:
Le niveau de défilement sera réglé sur 0 sans
setImmediate()
trop si l'itinéraire est modifié en cliquant sur un lien mais si l'utilisateur appuie sur le bouton retour sur le navigateur, cela ne fonctionnera pas car le navigateur réinitialise le niveau de défilement manuellement au niveau précédent lorsque le bouton retour est enfoncé , donc en utilisant,setImmediate()
nous faisons exécuter notre fonction une fois que le navigateur a fini de réinitialiser le niveau de défilement, nous donnant ainsi l'effet souhaité.la source
avec React router dom v4 vous pouvez utiliser
créer un composant scrollToTopComponent comme celui ci-dessous
ou si vous utilisez des onglets, utilisez quelque chose comme celui ci-dessous
j'espère que cela vous aidera pour plus d'informations sur la restauration du défilement.
la source
J'ai trouvé que cela
ReactDOM.findDomNode(this).scrollIntoView()
fonctionnait. Je l'ai placé à l'intérieurcomponentDidMount()
.la source
Pour les applications plus petites, avec 1 à 4 routes, vous pouvez essayer de le pirater en redirigeant vers l'élément DOM supérieur avec #id au lieu d'une simple route. Ensuite, il n'est pas nécessaire d'encapsuler les routes dans ScrollToTop ou d'utiliser des méthodes de cycle de vie.
la source
Dans votre
router.js
, ajoutez simplement cette fonction dans l'router
objet. Cela fera le travail.Comme ça,
**Routes.js**
la source
Peut être une solution simple au cas où les accessoires ne seraient pas modifiés et que componentDidUpdate () ne serait pas déclenché.
la source
C'est hacky (mais ça marche): je viens d'ajouter
window.scrollTo (0,0);
rendre();
la source