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 Routecomposant et tirer parti des méthodes de cycle de vie:
import React, { Component } from 'react';
import { Route, withRouter } from 'react-router-dom';
class ScrollToTopRoute extends Component {
componentDidUpdate(prevProps) {
if (this.props.path === this.props.location.pathname && this.props.location.pathname !== prevProps.location.pathname) {
window.scrollTo(0, 0)
}
}
render() {
const { component: Component, ...rest } = this.props;
return <Route {...rest} render={props => (<Component {...props} />)} />;
}
}
export default withRouter(ScrollToTopRoute);
Sur le, componentDidUpdatenous pouvons vérifier quand le chemin de l'emplacement change et le faire correspondre à l' pathaccessoire 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.jsexemple de la façon dont vous pouvez utiliser ce qui précède:
import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
import Lorem from 'react-lorem-component';
import ScrollToTopRoute from './ScrollToTopRoute';
import './App.css';
const Home = () => (
<div className="App-page">
<h2>Home</h2>
<Lorem count={12} seed={12} />
</div>
);
const About = () => (
<div className="App-page">
<h2>About</h2>
<Lorem count={30} seed={4} />
</div>
);
const AnotherPage = () => (
<div className="App-page">
<h2>This is just Another Page</h2>
<Lorem count={12} seed={45} />
</div>
);
class App extends Component {
render() {
return (
<Router>
<div className="App">
<div className="App-header">
<ul className="App-nav">
<li><Link to="/">Home</Link></li>
<li><Link to="/about">About</Link></li>
<li><Link to="/another-page">Another Page</Link></li>
</ul>
</div>
<Route exact path="/" component={Home} />
<ScrollToTopRoute path="/about" component={About} />
<ScrollToTopRoute path="/another-page" component={AnotherPage} />
</div>
</Router>
);
}
}
export default App;
À partir du code ci-dessus, il est intéressant de souligner que ce n'est que lors de la navigation vers /aboutou que /another-pagel'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
componentDidMountle composant de la nouvelle route?