React-router history.listen 没有在 componentWillMount 中运行

Posted

技术标签:

【中文标题】React-router history.listen 没有在 componentWillMount 中运行【英文标题】:React-router history.listen not running in componentWillMount 【发布时间】:2018-11-30 02:38:15 【问题描述】:

我正在尝试制作一个 SearchResults 组件,该组件根据查询字符串中的内容显示搜索结果,该查询字符串由 SearchForm 组件更新。建议here 我使用history.listen。好主意,除了在 componentWillMount 中调用时出于某种原因,history.listen 没有被触发:

componentWillMount() 
    let location;
    this.props.history.listen(routerState => 
        console.log('current location:' + routerState); //never logs anything...
        location = routerState;
    );
    console.log(location); //'undefined'
    let search = location;
    console.log(search); //'undefined'
    this.setState( search: search.search ); //throws "Cannot read property search of undefined error

这看起来很奇怪,因为我在这里使用 history.listen 与之前的海报在该链接中所做的几乎完全一样。我也尝试将这个逻辑放在 componentDidMount 中,结果相同。

我的组件在这里被withRouter包裹起来。

【问题讨论】:

【参考方案1】:

通过在监听调用中实现逻辑以及将初始化逻辑放入 componentDidMount 中解决了这个问题——这是必要的,因为 history.listen 仅在更改时触发,而不是在初始渲染时触发

我的代码:

componentWillMount() 
    this.unlisten = this.props.history.listen(location => 
        console.log('current location:' + location);
        let query = qs.parse(location.search);
        console.log(query) //logs an object with attributes based on the current query string
    );


componentWillUnmount() 
    this.unlisten();


componentDidMount() 
    let query = qs.parse(this.props.location.search);
    console.log(query); //logs an object with attributes based on the current query string

【讨论】:

以上是关于React-router history.listen 没有在 componentWillMount 中运行的主要内容,如果未能解决你的问题,请参考以下文章

[react-router] React-Router 3和React-Router 4有什么变化?添加了什么好的特性?

[react-router] React-Router怎么获取历史对象?

[react-router] React-Router怎么设置重定向?

[react-router] React-Router的实现原理是什么?

react-router v6对比react-router v5

[react-router] React-Router怎么获取URL的参数?