Redux Store 什么时候更新订阅组件的 props——是异步事件吗?
When does Redux Store updates the props of a subscribed component-- Is it asynchronous event?
我正在尝试解决一个场景,我正在调度一个同步的 redux 动作(使用 typesafe-actions
的 createAction
),然后不久之后进行依赖于更新的道具的网络调用来自商店。
场景:
在 clearFilters 处理函数(单击清除过滤器按钮时调用的处理函数)中,我正在调度一个同步操作,然后进行如下网络调用:
clearFilters = (): void => {
this.props.resetFilters(); //action dispatched
this.refreshData; //network call
};
在 refreshData
函数中,我的组件需要更新的过滤器道具,并基于它创建一个 searchCondition 以作为有效负载传递给列表 api 调用。
refreshData = (): void => {
const { listData, filters } = this.props; //get the filters prop
//Expected filters to be updated from the store post dispatch of action
const SearchCondition: SearchCondition = createSearchConditions(filters);
listData({
SearchCondition,
MaxResults: this.maxRecordsCount,
SortFields: this.getSortFields(),
}),
);
};
我的组件使用 mapStateToProps
:
订阅了 filters
道具
const mapStateToProps = (state: RootState) => ({
filters: state.common.filter.filters,
});
考虑到这是我面临的问题的状态,我尝试通过在代码中放置调试点来调试发生的情况:
- 调度动作时(在
clearFilters
函数内)
- reducer 内部,返回更新后的状态。
- 调用网络调用时(在
clearFilters
函数内)
- 在
refreshData
调用中。
在 reducer returns 更新状态后,根据调试知识,store 没有立即发送更新的 props。相反,控件返回到下一行,即 this.refreshData()
,它使用旧过滤器数据进行网络调用。只有在 clearFilters
函数调用完成后,在我的 componentDidUpdate
中,我才能看到道具更新发生了。
这是否表示 redux 状态变回 store 并且最终订阅的 prop 更新以异步方式发生?如果是这样,它是如何发生的?商店发送更新的道具是否在主线程中执行?
任何 pointers/documentation 都会很有帮助。
调度是同步的,React更新的排队是同步的。然而,在整个事件处理完成之前,React 不会 re-render 该组件,并且 this.props
将 不会 更新直到渲染发生之后。所以,不,你不能在调度一个动作后立即访问 this.props
并期望它已经更新。那永远不会是真的。
我建议阅读这些帖子,这些帖子对 React 和 React-Redux 进行了广泛的详细介绍:
我正在尝试解决一个场景,我正在调度一个同步的 redux 动作(使用 typesafe-actions
的 createAction
),然后不久之后进行依赖于更新的道具的网络调用来自商店。
场景:
在 clearFilters 处理函数(单击清除过滤器按钮时调用的处理函数)中,我正在调度一个同步操作,然后进行如下网络调用:
clearFilters = (): void => {
this.props.resetFilters(); //action dispatched
this.refreshData; //network call
};
在 refreshData
函数中,我的组件需要更新的过滤器道具,并基于它创建一个 searchCondition 以作为有效负载传递给列表 api 调用。
refreshData = (): void => {
const { listData, filters } = this.props; //get the filters prop
//Expected filters to be updated from the store post dispatch of action
const SearchCondition: SearchCondition = createSearchConditions(filters);
listData({
SearchCondition,
MaxResults: this.maxRecordsCount,
SortFields: this.getSortFields(),
}),
);
};
我的组件使用 mapStateToProps
:
filters
道具
const mapStateToProps = (state: RootState) => ({
filters: state.common.filter.filters,
});
考虑到这是我面临的问题的状态,我尝试通过在代码中放置调试点来调试发生的情况:
- 调度动作时(在
clearFilters
函数内) - reducer 内部,返回更新后的状态。
- 调用网络调用时(在
clearFilters
函数内) - 在
refreshData
调用中。
在 reducer returns 更新状态后,根据调试知识,store 没有立即发送更新的 props。相反,控件返回到下一行,即 this.refreshData()
,它使用旧过滤器数据进行网络调用。只有在 clearFilters
函数调用完成后,在我的 componentDidUpdate
中,我才能看到道具更新发生了。
这是否表示 redux 状态变回 store 并且最终订阅的 prop 更新以异步方式发生?如果是这样,它是如何发生的?商店发送更新的道具是否在主线程中执行?
任何 pointers/documentation 都会很有帮助。
调度是同步的,React更新的排队是同步的。然而,在整个事件处理完成之前,React 不会 re-render 该组件,并且 this.props
将 不会 更新直到渲染发生之后。所以,不,你不能在调度一个动作后立即访问 this.props
并期望它已经更新。那永远不会是真的。
我建议阅读这些帖子,这些帖子对 React 和 React-Redux 进行了广泛的详细介绍: