【问题标题】:how to handle route param changes to component using @connect如何使用@connect 处理对组件的路由参数更改
【发布时间】:2016-04-05 13:21:16
【问题描述】:

我有一个匹配 /roles/:id 之类的 Route 并呈现到右侧窗格中(见下文)。我正在使用@connect 将一些道具和动作传递到我的组件中,其中一个动作根据componentWillMount 钩子中的路由参数id 获取一些数据。

我的问题是我想不出一种干净的方法来确保当用户单击右侧列表中的不同实例时,从而更改路由(但不是卸载/安装组件!),操作再次被解雇。

我曾想过连接到componentWillReceiveProps,但显然这会创建一个无限渲染循环。我在这里遗漏了什么吗?

【问题讨论】:

  • 为什么连接到componentWillReceiveProps 会创建一个无限循环?您只需检查路由参数是否已更改:if (this.props.routeParam !== nextProps.routeParam) fetchData(nextProps.routeParam)
  • @vonD 在第一次渲染页面加载时失败
  • 在第一次渲染时,您可以像以前一样使用componentWillMount

标签: reactjs react-router redux react-redux


【解决方案1】:

有两种方法可以做到这一点

1- 使用装饰器模式获取数据,redux-async-connect

2- 像这样使用redux-thunk

export function fetchFoo(id) {
 return dispatch => {
   dispatch({type:'LOADING'});
   fetch(`/book/${id}`, (response) => {
     if(response.status == 200){
       dispatch({type:'SUCCESS'});
     }else { 
       dispatch({type:'FAIL'});
     }
   })
 }
}

初始状态应该是loading=trueisLoaded=true

LOADING 减速器中,您应该在您的状态下设置 loading=true 并在触发fetchFoo 操作之前检查loading 标志 这样你就不会有无限的请求了

componentWillReceiveProps:(nextProps){
  if(!nextProps.loading && !nextProps.isLoaded){
    fetchFoo(params);
  }
} 

我准备使用decorator-pattern 作为容器组件的第一个解决方案

【讨论】:

  • 虽然我不太喜欢以这种方式直接使用组件获取数据(因此将其保存在与全局状态原子的“命名空间”数据不同的位置),但它确实解决了问题。谢谢!
猜你喜欢
  • 2018-03-06
  • 2018-08-16
  • 2017-03-29
  • 2023-03-05
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2013-08-27
相关资源
最近更新 更多