我有一个用于搜索的减速器,并意识到它需要用于多个不相关的搜索组件。因此,通过查看 Redux 文档,我发现了高阶 reducer 的概念(http://redux.js.org/docs/recipes/reducers/ReusingReducerLogic.html#customizing-behavior-with-higher-order-reducers)(meta ngrx 中的减速器)并用它来创建我的搜索减速器的 2 个“实例”。然后我在同一个文档中发现这似乎可以与选择器一起使用,但实际上在记忆化方面存在问题(http://redux.js.org/docs/recipes/ComputingDerivedData.html#accessing-react-props-in-选择器)。那篇文章引用了一个名为“mapStateToProps”的函数,它似乎是将存储数据连接到组件的 React 特定方式(如果我理解正确的话......)。
在 ngrx 中是否有等价物,或者是否有另一种方法可以创建这些选择器来处理不同的 reducer 实例?
下面是一个基于我想要完成的 ngrx 示例应用程序的稍微做作的示例:
减速器/searchReducer.ts:
export interface State {
ids: string[];
loading: boolean;
query: string;
};
const initialState: State = {
ids: [],
loading: false,
query: ''
};
export const createSearchReducer = (instanceName: string) => {
return (state = initialState, action: actions.Actions): State => {
const {name} = action; // Use this name to differentiate instances when dispatching an action.
if(name !== instanceName) return state;
switch (action.type) {
//...
}
}
}
减速器/index.ts:
export interface State {
search: fromSearch.State;
}
const reducers = {
search: combineReducers({
books: searchReducer.createReducer('books'),
magazines: searchReducer.createReducer('magazines')
}),
}
export const getSearchState = (state: State) => state.search;
// (1)
export const getSearchIds = createSelector(getSearchState, fromSearch.getIds);
我相信上面的 getSearchIds 选择器需要能够以某种方式指定它正在访问的搜索 Reducer 的哪个实例。(奇怪的是,在我的代码中它似乎可以工作,但我不确定它是如何知道从哪个中选择的,我认为它存在 Redux 文档中讨论的记忆问题)。