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:
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, 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:
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 /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
componentDidMount
le composant de la nouvelle route?