Скажем, в состоянии моего приложения Reaction-Redux есть tree
, а tree
принадлежит myReducer
.Во многих случаях мне нужно сплющить это дерево, поэтому у меня есть селектор:
const getTree = state => state.myReducer.tree;
export const getFlatNodes = createSelector(
[getTree],
(tree) => flattenTree(tree)
);
И теперь мне нужно получить доступ к сплющенному дереву в действии
import { getFlatNodes } from 'path/to/selectors';
function myReducer(state = defaultState, action) {
switch (action.type) {
case SOME_ACTION:
const flattenedTree = getFlatNodes(state);
return {
...state,
smth: getSmthFromFlattenedTree(flattenedTree)
};
}
}
Этот код будетне работает должным образом, так как state
в редукторе является лишь частью состояния приложения.Простой обходной путь, который я нашел, - это обернуть state
, чтобы сделать переданный параметр совместимым:
import { getFlatNodes as _getFlatNodes } from 'path/to/selectors';
const getFlatNodes = myReducer => _getFlatNodes({ myReducer });
Код работает, хотя выглядит довольно хакерским, и я не уверен, что он не вызоветлюбые вопросы.
Кто-нибудь знает, почему и как это можно сделать лучше, или мой подход уже достаточно хорош?