最近有这样一个需求,原本该页面部分数据是来自于location.state,现在想要通过url直接输入参数(例如id)从而与后端接口通过该id获取剩余的所需数据。
但是出现了一个问题,因为在componentDidMount这个生命周期中就需要使用从后端获取到的数据,原本设想是在componentDidMount中使用dispatch异步请求数据后,通过redux改变this.props后使用setstate赋值给this.state(一切为了规范!方便!)。
不幸的是,setState函数是一个异步的函数,而在componentDidMount中进行setstate将会让新设置的state的值在componentDIDMount中无法获取,具体原因如下:
componentDidMount钩子将会在组件挂载后及页面更新前发生,而当使用了setState意味着触发一次额外渲染,再走一次render,并且在页面更新前。
当使用了setState将发生以下事情:
- 将
setState
传入的partialState
参数存储在当前组件实例的state
暂存队列中。- 判断当前React是否处于批量更新状态,如果是,将当前组件加入待更新的组件队列中。
- 如果未处于批量更新状态,将批量更新状态标识设置为true,用事务再次调用前一步方法,保证当前组件加入到了待更新组件队列中。
- 调用事务的waper方法,遍历待更新组件队列依次执行更新。
- 执行生命周期
componentWillReceiveProps
。- 将组件的
state
暂存队列