react监听路由变化

发表于:2018-01-09

监听路由变化是一个非常实用的功能,特别是一个page里多种类型查询

版本

"react": "^16.2.0",
"react-router-dom": "^4.2.2"

方法一

组件渲染完成之后监听路由变化

import React, { Component } from 'react'

class User extends Component {
    constructor (props) {
        super(props)
        this.state = {
            'framework': 'React'
        }
    }

    componentDidMount () {
        // 监听路由变化
        this.props.history.listen(route => {
            console.log(route);
        })
    }

    refreshRoute = () => {
        this.props.history.push(`/user/2222?t=${Date.now()}`)
    }

    render () {
        return (
            <section>
                <button onClick={this.refreshRoute}>button</button>
            </section>
        );
    }
}

export default User;

打印路由信息

方法二

组件重新渲染之前

import React, { Component } from 'react'

class User extends Component {
    constructor (props) {
        super(props)
        this.state = {
            'framework': 'React'
        }
    }
    /*
     * @param {Object} nextProps 即将要进入目标路由对象
     * @param {Object} nextState 即将要进入目标路由状态
     */
    componentWillUpdate (nextProps, nextState) {
        console.log(nextProps);
        console.log(nextState);
    }

    refreshRoute = () => {
        this.props.history.push(`/user/2222?t=${Date.now()}`)
    }

    render () {
        return (
            <section>
                <button onClick={this.refreshRoute}>button</button>
            </section>
        );
    }
}


export default User;

输出

2018-11-15更新说明:componentWillUpdate 生命周期目前已废弃,所以不推荐这种方法了。

方法三

跟第二种方法是一样,只不过重新渲染之后

import React, { Component } from 'react'

class User extends Component {
    constructor (props) {
        super(props)
        this.state = {
            'framework': 'React'
        }
    }
    /*
     * @param {Object} prevProps 当前导航正要离开的路由
     * @param {Object} prevState 当前导航正要离开的状态信息
     */
    componentDidUpdate (prevProps, prevState) {
        console.log(prevProps);
        console.log(prevState);
    }

    refreshRoute = () => {
        this.props.history.push(`/user/2222?t=${Date.now()}`)
    }

    render () {
        return (
            <section>
                <button onClick={this.refreshRoute}>button</button>
            </section>
        );
    }
}

export default User;

使用hooks

注意:React需要16.8.0以上

通过监听 location 是否发生变化从而 update

import React, { useEffect } from 'React';

const App = function (props) {

  useEffect(() => {
    console.log(props.location);
  }, [props.location])
}

export default App;

React
广告