Đối với react-router v4 , đây là ứng dụng tạo-phản ứng giúp khôi phục cuộn: http://router-scroll-top.surge.sh/ .
Để đạt được điều này, bạn có thể tạo trang trí Route
thành phần và tận dụng các phương pháp vòng đời:
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);
Trên đó, componentDidUpdate
chúng tôi có thể kiểm tra khi tên đường dẫn vị trí thay đổi và khớp với nó path
và nếu những người đó hài lòng, hãy khôi phục cuộn cửa sổ.
Điều thú vị về cách tiếp cận này là chúng ta có thể có các tuyến khôi phục cuộn và các tuyến không khôi phục cuộn.
Đây là một App.js
ví dụ về cách bạn có thể sử dụng ở trên:
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;
Từ đoạn mã trên, điều thú vị cần chỉ ra là chỉ khi điều hướng đến /about
hoặc /another-page
hành động cuộn đến đầu trang mới được định dạng trước. Tuy nhiên, khi tiếp tục /
không có khôi phục cuộn sẽ xảy ra.
Toàn bộ cơ sở mã có thể được tìm thấy tại đây: https://github.com/rizedr/react-router-scroll-top
componentDidMount
thành phần của tuyến đường mới?