我正在通过react-router-dom v4中的Redirect重新加载组件,当第一次加载组件时,api调用会在ComponentDidMount中发生。但是,当Redirect触发组件重新加载时,此方法不会运行。
我有组件TopicList,它是使用react-router-dom中的Route通过路径/ topic显示的
PostTopic是在TopicList中呈现的模态。在PostTopic内,我向状态添加了一个名为redirect的属性,并使用该属性将Redirect Component呈现为=“ / topic”,我将一些数据发布到api后进行了重定向。
在topicList通过Redirect重新加载时,componentDidMount()未运行,因此不会发生用于获取新发布的数据的api调用。
在通过react-router的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()} } }
componentDidMount 仅在组件最初安装在DOM中且URL参数更改时未安装新组件时才运行。
componentDidMount
您需要使用componentDidUpdate并检查URL参数是否已更改,如果是这种情况,请再次获取数据。
componentDidUpdate
例
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> ); } }