使用vue-router的时候会有路由守卫 afterEach 方便跳转页面后执行跳转到页面顶部:
1 2 3
| 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组件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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)
|
- 在定义路由处引用该组件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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> ) } }
|
参考地址: