В этом Redux: Colocating Selectors with Reducers Учебник Egghead, Дэн Абрамов предлагает используя селекторы, которые принимают полное дерево состояний, а не срезы состояния, для инкапсуляции знания состояния из компонентов. Он утверждает, что это облегчает изменение государственной структуры, поскольку компоненты не знают об этом, о чем я полностью согласен.
Однако подход, который он предлагает, заключается в том, что для каждого селектора, соответствующего конкретному срезу состояния, мы снова определяем его вместе с корневым редуктором, чтобы он мог принять полное состояние. Разумеется, эта накладная реализация подрывает то, что он пытается достичь... упрощая процесс изменения государственной структуры в будущем.
В большом приложении со многими редукторами, каждый со многими селекторами, не будем ли мы неизбежно сталкиваться с коллизиями имен, если мы определяем все наши селекторы в корневом файле редуктора? Что неправильно с импортом селектора непосредственно из его родственного редуктора и перехода в глобальное состояние вместо соответствующего среза состояния? например.
const todos = (state = [], action) => {
switch (action.type) {
case 'ADD_TODO':
return [...state, todo(undefined, action)];
case 'TOGGLE_TODO':
return state.map(t => todo(t, action));
default:
return state;
}
};
export default todos;
export const getVisibleTodos = (globalState, filter) => {
switch (filter) {
case 'all':
return globalState.todos;
case 'completed':
return globalState.todos.filter(t => t.completed);
case 'active':
return globalState.todos.filter(t => !t.completed);
default:
throw new Error(`Unknown filter: ${filter}.`);
}
};
Есть ли недостаток, чтобы сделать это таким образом?