Правильный способ использования immutablejs (toJS и fromJS) с избыточным - PullRequest
0 голосов
/ 07 ноября 2018

Интересно, это правильный способ использования immutable.js с редуксом и reselect (также redux-saga). Конкретно мне интересно про toJS() и от fromJS() и где их использовать. Моя идея такова:

  1. Я использую toJS() при отправке данных в сагу.
  2. I не использует fromJS() в редукторе, потому что я думаю, что это все равно происходит из-за того, что я использую fromJS() для initialState. Или я не прав?
  3. Я использую toJS() в селекторе из reselect, поэтому я могу использовать данные js в компоненте реагирования.
* * 1 022 Пример: * 1 023 *

1) В моем реактивном компоненте я делаю:

// mapDispatchToProps
   function mapDispatchToProps(dispatch) {
      return {
         loginRequest: values => dispatch(loginRequest(values)),
      };
   }

// Sending values.toJS() to my redux-saga. 
   submit = values => {
      this.props.loginRequest(values.toJS());
   };

2) В редукторе я делаю ( должен один раз использовать fromJS() здесь или нет? В соответствии с документацией на редуктор вы должны):

const { fromJS } = require('immutable');
const state = fromJS({
  pages: {
    usersPage: {
      loading: false,
      isFetched: false,
      list: [],
    }
  }
});
function reducer(state, action) {
  switch(action.type) {
    case 'USERS_LOADED':
      return state
        .setIn(['usersPage', 'list'], action.payload) // fromJS() here or not?
        .setIn(['usersPage', 'isFetched'], true)
        .setIn(['usersPage', 'loading'], false)
        ;
    default:
      return state;
  }
}
export default reducer;

3) В моем селекторе я снова делаю toJS():

const selectUser = state => state.get('user', initialState);
const makeSelectList= () =>
   createSelector(selectUser, userState => userState.getIn(['usersPage', 
'list']).toJS());

// Which I then use in my react component:
const mapStateToProps = createStructuredSelector({
   list: makeSelectList(),
});

Так что в основном мне интересно, является ли это правильным потоком преобразования между js и неизменным. Или это может быть каким-то образом оптимизировано (меньше шагов конвертации)? Может быть, вышесказанное - неоптимальный способ логики?

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 15 ноября 2018
  1. Сага, являющаяся избыточным промежуточным программным обеспечением, может напрямую обрабатывать неизменяемые типы, не нужно использовать дорогой toJS, звоните сюда

  2. Любая точка, которую вы конвертируете (например, set, setIn, update и т. Д.), Простой непростой тип JS в дерево неизменяемых состояний, используйте fromJS для обеспечения полной Неизменяемый тип Сделать неизменным все дерево состояний

  3. ИМХО, селекторы (например, reselect) - путем предоставления напоминания после первоначального поиска - могут быть наиболее идеальным местом для использования дорогих вызовов toJS, как в вашем примере # 3. Я предполагаю, что это действительно зависит от того, насколько не нравится использование методов поиска Immutable в их «контейнерах / интеллектуальных» компонентах и ​​/ или создание целой группы селекторов для извлечения простых типов JS из дерева состояний редуксов Повсеместное использование Immutable

Для меня вопрос о том, где на самом деле использовать вызов fromJS, например, создатели действий, в диспетчере «контейнер / умные» компоненты или, в редукторе, например, react-boilerplate использует вызов fromJS в редукторе.

...