Использование повторного выбора-селекторов в редукторе

Допустим, есть tree в состоянии моего приложения response-redux, а 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 });

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

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

Можно попробовать использовать npmjs.com/package/combine-section-reducers. С помощью secion reducer у вас есть доступ ко всему состоянию в каждом subreducer

iofjuupasli 22.11.2018 13:01

Полезные данные действия обычно используются для передачи соответствующих данных в редуктор. В вашем случае компонент, который вызывает действие, или сам создатель действия будет использовать селектор для получения данных из состояния с помощью getSmthFromFlattenedTree(flattenedTree) и отправки действия с полезной нагрузкой: {type: "SOME_ACTION", smthFromState}

Vincas Stonys 22.11.2018 16:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
1 093
1

Ответы 1

Может быть, если вы сделаете это в своем действии

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)
           };
    }
}

Другие вопросы по теме