Как настроить Ember как вычисляемые свойства в Immutablejs и Redux и Flux и реагировать

Я привык вычислять свойства в Объектная Модель Ember. Это удобный способ указать вычисляемые свойства, которые зависят от других свойств.

сказать fullName зависит от firstName и lastName, Я могу настроить вычисляемые свойства как функция computeProperties и звонок computeProperties каждый раз, когда я вношу изменения.

пример:

function computeFullName(state) {
  const fullName = state.get('firstName') + state.get('lastName');
  const nextState = state.set('fullName', fullName);
  return nextState;
}

function computeProperties(state) {
  const nextState = computeFullName(state);
  return nextState;
}

// store action handler
[handleActionX](state) {

  let nextState = state.set('firstName', 'John');
  nextState = state.set('lastName', 'Doe');

  nextState = computeProperties(nextState);

  return nextState;
}

есть ли способ автоматически настроить вычисляемые свойства, чтобы мне не приходилось вызывать дополнительные функции каждый время. В Redux или в ImmutableJS.

4 ответов


Redux автор здесь!

используя reselect как предложено WildService - это путь. Я думаю, мы не будем включать это в core, потому что reselect делает свою работу хорошо, и мы в порядке с тем, что это отдельная библиотека.

Я хотел отметить пару вещей:

  • даже при повторном выборе вы не хотите вычислять данные внутри вашего редуктора. Селекторы должны работать on государство, управляемое редукторами. Иначе говоря, селекторы-это шаг между вашим состоянием магазина Redux и вашими компонентами-они не находятся внутри ваших редукторов. важно, чтобы состояние Redux было нормализовано, поэтому его легко обновить.

  • мы на самом деле рекомендуем вам определить селекторы вместе с соответствующие редукторы, так что когда вы меняете форму состояния, вам не нужно менять свои компоненты-вместо этого они будут использовать селекторы. Вы можете увидеть пример это в Redux папка сравнения потоков

  • У нас есть страница документации введение reselect и описание того, как использовать его для вычисления производных данных. Проверить его.


проверить выберите. Composable чисто функции для эффективно вычислять выведенные данные от магазинов. Afaik есть планы свернуть селекторы reselect в Redux core на каком-то этапе, если они окажутся популярными. Есть пример использования с ImmutableJS в нижней части readme тоже.


для создания вычисляемых свойств можно использовать автономную наблюдаемую библиотеку mobservable.

var user = mobservable.props({
  firstName: 'John',
  lastName: 'Doe',
  fullName: function() {
    return this.firstName + this.lastName
  }
});

var nameViewer = mobservable.ObservingComponent(React.createClass({
   render: function() {
       return (<span>{user.fullName}</span>)
   }
});

это должно быть сутью этого, теперь любое изменение пользователя.firstName или lastName будет повторно передавать ваш компонент nameViewer. Вы можете дополнительно объединить это с реализациями потока, такими как redux, чтобы изменить данные и протолкнуть самого пользователя через дерево компонентов. Но обратите внимание, что сам объект пользователя не неизменяемый (в этом случае это не будет наблюдаемый в конце концов ;-)) Также см. Это тривиальные и немного интереснее скрипки для некоторых примеров.


Как насчет чего-то подобного?

export const getWidgetsWithComputedProps = widgets => {
  return widgets.map(w => getWidgetWithComputedProps(w));
};

export const selectWidgetType = widget => {
  switch (widget.type) {
    case 'line':
      return 'time-series';
    case 'pie':
    case 'bar':
      return 'cross-sectional';
    default:
      console.warn('Back up: that type of widget does not exist!', widget.type);
      return null;
  }
};

export const getWidgetWithComputedProps = createSelector(
  widget => widget,
  selectWidgetType,
  (widget, _type) => {
    return {...widget, _type}
  }
);