Untuk react-router v4 , berikut adalah aplikasi create-react yang mencapai pemulihan gulir: http://router-scroll-top.surge.sh/ .
Untuk mencapai ini, Anda dapat membuat menghias Route
komponen dan memanfaatkan metode siklus hidup:
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);
Di bagian componentDidUpdate
kita dapat memeriksa kapan nama path lokasi berubah dan mencocokkannya dengan path
prop dan, jika mereka puas, mengembalikan window scroll.
Yang keren dari pendekatan ini, adalah kita dapat memiliki rute yang memulihkan gulir dan rute yang tidak mengembalikan gulir.
Berikut adalah App.js
contoh bagaimana Anda dapat menggunakan yang di atas:
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;
Dari kode di atas, yang menarik untuk ditunjukkan adalah bahwa hanya ketika menavigasi ke /about
atau /another-page
tindakan gulir ke atas yang akan dilakukan. Namun ketika /
tidak ada pemulihan gulir yang akan terjadi.
Seluruh basis kode dapat ditemukan di sini: https://github.com/rizedr/react-router-scroll-top
componentDidMount
komponen rute baru?