1.公共数据,都是通过redux放在store里面的。具体是在/dashboard 组件 的componentDidMount()中通过异步action去改变store,比如reducer结构是user:{id:0}
2.在父组件下的子页面,比如/dashboard/test 组件下。有一个getList的方法,getList(this.props.user.id)
3.当刷新 /dashboard/test的时候。会有两次请求1.getUser 2.getList.如果这个时候id还没有写入store的话。getList就会报错。
4.目前的方案:
componentWillReciveProps(nextProps){
if(this.props.user.id!=nextProps.user.id){
getList(nextProps.user.id)
}
}
这样有个问题,就是如果 已经拿到了userId,在两个子页面切换的时候 也不会触发componentWillReciveProps。
这样就不会执行getList
还有没有好的解决方案啊?
============补充内容===========
可能是我没表述清楚。
1.父页面
componentDidMount(){
this.props.action.getUser()//异步拿到userId放入store
}
2.子页面1
componentDidMount(){
this.getXXList(userId)//获取某个xx list需要userId
}
3.子页面2
componentDidMount(){
this.getYYList(userId)//获取某个yy list需要userId
}
场景:刷新子页面1
现象:执行this.getXXList(userId) ,this.props.action.getUser()
有可能userId还没拿到,就执行了getXXList
一个原则:通用数据没回来之前,我的业务组件压根就不渲染。比如,用户数据没回来之前我可以一直显示Loading。等用户数据回来之后再正常走流程(解决了你的依赖问题)
什么时候获取用户数据?
建议在最顶层组件去做(如果一定要在
componentDidMount
中获取的话),顶层组件在数据没回来之前一直Loading(或者你喜欢的页面),数据回来之后正常渲染。回到你的需求来说。
就是用户数组没回来之前,你的/dashboard/test是不会进行渲染的(可以简单的理解为返回了null),然后具体到子组件,一般也是在
componentDidMount
的时候进行数据获取(不会存在你的那个userid判断),而恰恰当子组件进行切换的时候,你应该在componentWillReceiveProps
中判断子页面的id(不同则进行list数据获取。