pau*_*llc 3 javascript reactjs redux redux-toolkit rtk-query
我有一系列组件,它们都使用从 RTK 查询响应派生的数据。虽然源自具有相同查询参数的相同响应,但每个组件都需要数据通过一组相对昂贵的客户端过滤器(其参数是 redux 存储切片属性),这些过滤器对于每个组件来说可能不相同。然而,所有组件都要求数据至少通过两个特定的过滤器。这种关系如下图所示:
是否可以在通过特定过滤器/过滤器组转换数据后订阅数据?
我考虑过的方法:
extraReducers选项并监听查询完成,然后执行过滤操作。这工作正常,因为我可以在减速器中使用过滤器参数,但我相信一旦过滤器参数更新但查询数据保持不变,我就无法使用新参数重复操作。直觉上,我认为在 API 结果和组件的订阅数据之间作为中间件运行的回调是理想的。我知道 API 切片中可定义的transformResponse选项,但我认为它对于这种情况是不合适或不可能的。
const queryResult = endpointName.useQuery(args, filterArgs, (data, filterArgs) => {
return data.performSomeSharedFilterOperationHere(filterArgs);
}
);
Run Code Online (Sandbox Code Playgroud)
理想情况下,当查询参数更改或过滤器参数更改时,数据将更新。我想这和简单的 useEffect 实现之间的区别在于,在 useEffect 场景中,数据不是“共享”的,并且过滤器操作发生 nSubscribedComponents 次。
RTK 中是否有任何内容可以实现我正在寻求的行为?
我认为这里正确的答案是使用查询挂钩中的选项selectFromResult。
创建以下重新选择选择器:
const selectFilter1 = createSelector(
// Start by taking the actual response data as its input
(inputData) => inputData,
(data) => // magically transform here
)
const selectFilter2 = createSelector(
selectFilter1,
(filteredData) => // magically transform here
)
// repeat for filters 2 and 3
Run Code Online (Sandbox Code Playgroud)
然后,在组件中:
const selectFilter1 = createSelector(
// Start by taking the actual response data as its input
(inputData) => inputData,
(data) => // magically transform here
)
const selectFilter2 = createSelector(
selectFilter1,
(filteredData) => // magically transform here
)
// repeat for filters 2 and 3
Run Code Online (Sandbox Code Playgroud)
这些组件将共享相同的选择器实例,因此每次调用选择器时都result.data应该传入相同的引用,因此计算应该被记住。前几个选择器应该记住它们的结果,因此selectFilter3只需selectFilter2在 的结果发生变化等时重新计算。
| 归档时间: |
|
| 查看次数: |
5080 次 |
| 最近记录: |