Использование реселект-селекторов в редукторе - PullRequest
0 голосов
/ 22 ноября 2018

Скажем, в состоянии моего приложения 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 });

Код работает, хотя выглядит довольно хакерским, и я не уверен, что он не вызоветлюбые вопросы.

Кто-нибудь знает, почему и как это можно сделать лучше, или мой подход уже достаточно хорош?

1 Ответ

0 голосов
/ 23 ноября 2018

Возможно, если вы сделаете это в своем действии

const someAction = () => (dispatch, getState) => ({
  type: 'SOME_ACTION',
  payload: getFlatNodes(getState())
  // payload: getSmthFromFlattenedTree(getFlatNodes(getState()))
});

, то в вашем редукторе

function myReducer(state = defaultState, action) {
    switch (action.type) {
       case SOME_ACTION:
           return {
               ...state,
               smth: getSmthFromFlattenedTree(action.payload)
           };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...