我正在通过Redirect从react-router-dom v4重新加载组件, 首次加载组件时,api调用会在ComponentDidMount中发生。但是,当Redirect触发组件重新加载时,此方法不会运行。
我有组件TopicList,它是通过路径/ topic使用react-router-dom中的Route来显示的
PostTopic是在TopicList中呈现的模态。在PostTopic内,我向状态添加了一个名为redirect的属性,并使用该属性将Redirect Component呈现为=“ / topic”,我将一些数据发布到api后进行了重定向。
在topicList中通过重定向重新加载时,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()}
}
}
答案 0 :(得分:2)
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>
);
}
}