如果在生命周期的componentWillMount
阶段调用异步操作,那么一旦该操作完成,是否有办法让willReceiveProps
触发?
实施例
class asyncComponent extends react.component() {
static propTypes = {
data: PropTypes.object,
dispatch: propTypes.func
}
componentWillMount() {
this.props.dispatch(actions.fetchAsnycData()) //Updates data prop once async fetch is done
}
render() {
<DumbComponent data={this.props.data} />
}
}
class DumbComponent extends react.Component() {
static propTypes = { data: PropTypes.object }
componentWillReceiveProps() {
console.log(this.props.data) //never called
}
render() {...}
}
这里永远不会调用componentWillReceiveProps()
方法,因为即使组件确实收到了props,因为该操作是在componentWillMount
生命周期阶段触发的,所以它被认为是第一次渲染的一部分。
答案 0 :(得分:0)
感谢@suthan在评论中提供的帮助,我提出了这个有效的解决方案:
class asyncComponent extends react.component() {
static propTypes = {
data: PropTypes.object,
dispatch: propTypes.func
}
childDidMount() {
this.props.dispatch(actions.fetchAsnycData()) //Updates data prop once async fetch is done
}
render() {
<DumbComponent data={this.props.data}
componentDidMount={this.childDidMount}.bind(this) />
}
}
class DumbComponent extends react.Component() {
static propTypes = { data: PropTypes.object, componentDidMount: PropTypes.func }
componentWillReceiveProps() {
console.log(this.props.data) //works!
}
componentDidMount() {
this.props.componentDidMount();
}
render() {...}
}
我已经尝试过,将操作放在父组件的componentDidMount
方法中。诀窍是意识到父组件安装在子组件之前,因此需要在子组的componentDidMount
阶段触发操作。从父级传递对函数的引用允许我保留我的无状态组件并实现期望的结果。