들어 V4 라우터 반응 , 여기에 스크롤 복원을 달성하는 생성 - 반응 - 응용 프로그램입니다 : http://router-scroll-top.surge.sh/ .
이를 위해 Route
컴포넌트 데코레이션을 생성 하고 라이프 사이클 메소드를 활용할 수 있습니다 .
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);
상의 componentDidUpdate
위치 경로가 변경 될 때 우리는 확인할 수 있습니다과에 일치path
소품과, 그 만족하는 경우, 윈도우 스크롤을 복원 할 수 있습니다.
이 접근법의 멋진 점은 스크롤을 복원하는 경로와 스크롤을 복원하지 않는 경로를 가질 수 있다는 것입니다.
다음은 App.js
위의 사용 방법에 대한 예입니다.
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;
위의 코드에서 흥미로운 점은 탐색 할 때만 /about
또는 /another-page
위로 스크롤 작업이 수행된다는 것입니다. 그러나 계속할 때/
스크롤 복원이 발생하지 않습니다.
전체 코드베이스는 https://github.com/rizedr/react-router-scroll-top 에서 찾을 수 있습니다.
componentDidMount
새 경로의 구성 요소 에서 논리를 수행 할 수 없습니까?