通过React Router重新加载相同路由后的API调用

3
我正在使用来自react-router-dom v4的Redirect重新加载组件,当组件首次加载时,api调用发生在ComponentDidMount中。但是,当通过Redirect触发组件重载时,此方法不会运行。
我有一个名为TopicList的组件,它由react-router-dom中的Route路径/topic显示。
PostTopic是一个模态框,在TopicList中呈现。在PostTopic内部,我添加了一个称为redirect的属性到状态中,并使用它来渲染到to="/topic"的Redirect组件。在将一些数据发布到api后,我进行重定向。
在TopicList中,当通过Redirect重新加载时,componentDidMount()不会运行,因此无法进行新发布数据的api调用。
最好的方法是什么,在通过React路由器从Redirect重新加载相同的路由之后,重新获取api调用的数据?
class PostTopic extends Component


state = {
  redirect: false
}

handleSubmit = (e) => {
  e.preventDefault();
  const { body, subject } = this.state;
  api.postTopic(this.props.store.token,subject,body)
  .then( response => {
     this.setState({redirect:true})
   })
   .catch( error => {
      this.setState({error});
   });
}

renderRedirect = () => {
  if(this.state.redirect){
    return <Redirect to={this.props.currentPath}/>
  }
}

render(){
  return(
     ...
     ...
     ...
     {this.renderRedirect()}                
  }
}
1个回答

3

componentDidMount 仅在组件初次挂载到 DOM 上时运行,当 URL 参数更改时不会重新挂载组件。

您需要使用 componentDidUpdate 并检查 URL 参数是否已更改,如果是,则再次获取数据。

示例

function getData() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(Array.from({ length: 3 }, () => Math.random()));
    }, 1000);
  });
}

class Page extends React.Component {
  state = { data: [] };

  componentDidMount() {
    getData().then(data => {
      this.setState({ data });
    });
  }

  componentDidUpdate(prevProps) {
    if (prevProps.match.params.pathParam !== this.props.match.params.pathParam) {
      getData().then(data => {
        this.setState({ data });
      });
    }
  }

  render() {
    return (
      <div>
        {this.state.data.map(element => <div key={element}>{element}</div>)}
      </div>
    );
  }
}

class App extends React.Component {
  render() {
    return (
      <BrowserRouter>
        <div>
          <Link to="foo"> Foo </Link>
          <Link to="bar"> Bar </Link>
          <Switch>
            <Route path="/:pathParam" component={Page} />
          </Switch>
        </div>
      </BrowserRouter>
    );
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接