我用这个方法来处理组件,componentWillMount初始化主页的数据和routerWillReceiveProps当路由器改变时(类别页面),但是当我从类别页面回到主页时,我知道因为componentWillMount只做了一次所以我看不到数据。
componentWillMount(){
this.props.fetchBooks(1)
}
componentWillReceiveProps(nextProps){
if(nextProps.match.params.id && nextProps.match.params.id !== this.props.match.params.id){
this.props.fetchBookByCategory(nextProps.match.params.id)
}
}
我将这个初始化的代码放到componentWillReceiveProps,它可以工作,但它会不断地调用fetchBooks(1),尽管我试着做了一些条件,请帮我解决这个问题,非常感谢。
答案 0 :(得分:0)
你必须在componentWillReceiveProps上将thisProps设置为this.props
componentWillReceiveProps(nextProps){
if(nextProps.match.params.id && nextProps.match.params.id !== this.props.match.params.id){
this.props.fetchBookByCategory(nextProps.match.params.id)
this.props = nextProps;
}
答案 1 :(得分:0)
永远不要在componentWillMount
或constructor
中抓取。而是在componentDidMount
中进行。
在安装发生之前立即调用componentWillMount()。它 在render()之前调用,因此同步设置状态 此方法不会触发重新渲染。避免引入任何 此方法中的副作用或订阅。
componentDidMount()在组件出现后立即调用 安装。需要DOM节点的初始化应该放在这里。如果你 需要从远程端点加载数据,这是一个好地方 实例化网络请求。在这种方法中设置状态会 触发重新渲染。
如果尚未收到数据,您可以有条件地呈现您的网页。
render(){
return(
<div>
{
data.length > 0 ?
<List items={data} /> :
<div>Loading...</div>
}
</div>
);
}