在 react-router 中切换同一级别的路由时获取数据的正确方法?

Posted

技术标签:

【中文标题】在 react-router 中切换同一级别的路由时获取数据的正确方法?【英文标题】:Correct way to fetch data when switching route on same level in react-router? 【发布时间】:2016-10-04 07:16:53 【问题描述】:

在同一级别切换路由时获取数据的正确方法是什么? 因为,根据this,同层切换路由会 只打电话给componentWillReceivePropscomponentDidUpdate。 而componentDidMount只在第一次进入路由时调用。

使用这样的路由配置:

render((
  <Provider store=store>
    <Router>
      <Route path="/" component=App>
        <Route path="/:userId" component=Profile/>
      </Route>
    </Router>
  </Provider>
), document.getElementById('root'));

Profile 组件是:

class Profile extends React.Component 
  componentDidMount() 
    // initial data
    this.fetchUserData();
  
  componentWillReceiveProps(nextProps) 
    if (this.props.params.userId !== nextProps.params.userId) 
      this.fetchUserData();
    
  
  shouldComponentUpdate(nextProps) 
    return this.props.params.userId !== nextProps.params.userId;
  
  render() 
    return (
      <div className="profile"></div>
    );
  

数据将存储在应用程序状态字段 (props.userData)。但, 这显然会扰乱渲染周期,因为路线是 在获取数据完成之前切换。

但是,如果我改成这样:

// deepEqual is function to check object equality recursively
componentWillReceiveProps(nextProps) 
  if (!deepEqual(this.props.userData, nextProps.userData)) 
    this.fetchUserData();
  

shouldComponentUpdate(nextProps) 
  return !deepEqual(this.props.userData, nextProps.userData);

这不起作用,因为在获取 userData 之前,那些道具是 非常平等。

那么,同级路由切换时如何获取数据?

【问题讨论】:

Component does not remount when route parameters change的可能重复 叹息......差不多三年后,这个问题被标记为重复。 【参考方案1】:

来自React Router docs:

componentDidMount () 
  // fetch data initially in scenario 2 from above
  this.fetchInvoice()
,

componentDidUpdate (prevProps) 
  // respond to parameter change in scenario 3
  let oldId = prevProps.params.invoiceId
  let newId = this.props.params.invoiceId
  if (newId !== oldId)
    this.fetchInvoice()
, 

当路由更改时this.props.params.userId 将更新,它被componentDidUpdate 捕获,并触发一次获取。当然,此获取可能会更新状态或 props 触发另一个重新渲染以显示获取的数据。

【讨论】:

以上是关于在 react-router 中切换同一级别的路由时获取数据的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何用react-router做网易云音乐的路由切换

react-router

react-router 4 切换路由跳转到页面顶部

react-router 同一路由,参数不同,页面没有刷新

react-router简介

react-router学习笔记