使用vue-router的时候会有路由守卫 afterEach 方便跳转页面后执行跳转到页面顶部:
router.afterEach(function () {
window.scrollTo(0, 0);
})
但是react-router 却没有这种函数,特别是react-router 4 更是取消了onEnter onUpdate函数.
解决方法:
withRouter
可以包装任何自定义组件,将react-router 的 history,location,match 三个对象传入。无需一级级传递react-router 的属性,当需要用的router 属性的时候,将组件包一层withRouter,就可以拿到需要的路由信息
- 定义ScrollToTop组件:
import React, { Component } from 'react';
import { withRouter } from "react-router-dom";
class ScrollToTop extends Component {
componentDidUpdate(prevProps) {
if (this.props.location.pathname !== prevProps.location.pathname) {
window.scrollTo(0, 0);
}
}
render() {
return this.props.children;
}
}
export default withRouter(ScrollToTop)
- 在定义路由处引用该组件:
import ScrollToTop from '../components/ScrollToTop';
export default class Root extends Component {
render() {
return (
<Router>
<ScrollToTop>
<Header />
<Menus />
{/* 首页 */}
<Route exact path="/" component={Home} />
{/* 图文 */}
<Switch>
<Route exact path="/one" component={OneList} />
<Route path="/one/:id" component={OneDetails} />
</Switch>
</ScrollToTop>
</Router>
)
}
}