假设我有一个音乐商店应用程序,用户可以在其中搜索吉他。在初始页面加载时,我获取了几种吉他来显示:(原声、电声和贝斯)。吉他结果页面通过单个 API 调用一起返回,但永远不会一起显示。因此,它们必须在某个时候进行过滤。要查看不同类别的吉他,用户将从 React 组件切换他们查看的类别。
似乎有两种主要方法可以使用不可变和 redux 来解决这个问题。
在策略一中,我在数据到达时过滤 category 上的数据,并将其单独存储在 redux 存储中。当我想检索数据时,我在选择器中指定类别。
在策略 2 中,所有进来的 API 数据都存储在一个聚合列表“all”中。当我想检索特定类别的吉他时,我使用选择器从聚合数据中过滤和显示。
策略一:
// REDUCER
export const GuitarReducer = (state, action) => {
const { payload, type } = state;
switch (type) {
case "acoustic": {
let existing = // GET EXISTING
return state.set("acoustic",
existing.concat(payload.filter(result => (result.category === "acoustic")))
)
}
case "electric": {
let existing = // GET EXISTING
return state.set("electric",
existing.concat(payload.filter(result => (result.category === "electric")))
)
}
case "bass": {
let existing = // GET EXISTING
return state.set("bass",
existing.concat(payload.filter(result => (result.category === "bass")))
)
}
}
}
// SELECTOR
export const selectCategory = createSelector(
[getCategory, getGuitarReducer],
(category, guitarReducer) => {
return GuitarReducer.get(category);
}
);
策略二:
// REDUCER
export const GuitarReducer = (state, action) => {
const { payload, type } = state;
...
let existing = // GET EXISTING
...
return state.set("all",
existing.concat(payload)
)
}
// SELECTOR
export const selectCategory = createSelector(
[selectAllGuitars],
(category, guitars) => {
return guitars.filter(guitar => (guitar.category = category));
}
);
一种模式会比另一种模式提供更好的性能吗?哪种模式更好地遵循 redux 的最佳实践?
我听说最好选择选择器来计算派生数据,并且当对数据执行另一个操作(例如在选项卡之间切换)时,记忆将缓存结果以供使用。因此,我不清楚更喜欢哪种策略。