2016-12-14 2 views
1

Описание проекта: У меня есть календарь, такой как Календарь Google, где у вас есть кнопки увеличения и увеличения, а также датпикер, где вы можете нажмите любую дату, чтобы переместить календарь на эту дату.Как обновить два значения в двух разных редукторах одновременно в операциях Redux/Atomic

Дизайн магазина: У меня есть редуктор фильтров, где я сохраняю диапазон текущего календаря (например {start: '01/01/2016 ', end: '01/01/2017'}) , а также редуктор UI, где я сохранить текущий уровень масштабирования (один год/месяц/неделю)

Сценарий: Когда кто-то на zoomLevel = «год» и нажимает на дату на DatePicker, мне нужно перейти на zoomLevel = 'week', а также изменить диапазон.

Проблема: Как обновить магазин как с увеличением, так и с диапазоном, в то же время? Если я этого не сделаю, мой календарь прерывается из-за несогласованности, потому что когда я обновляю первое значение, пользовательский интерфейс отображает все.

UI Редуктор как пример универсального редуктора:

import * as actions from './action-types' 
import { omit } from 'lodash' 
import initialState from './initial-state' 
export * from './actions' 
export * from './selectors' 

// TODO: Eval. Tendria mas sentido hacer el switch por dominio? 
export default function ui(state = initialState, {type, meta: {domain = 'general'} = {}, payload: {key, value} = {}}) { 
    switch (type) { 
    case actions.SET: 
    return { 
     ...state, 
     [domain]: { 
     ...state[domain] || {}, 
     [key]: value 
     } 
    } 
    case actions.TOGGLE: 
    return { 
     ...state, 
     [domain]: { 
     ...state[domain] || {}, 
     [key]: !!!(state[domain] || {})[key] 
     } 
    } 
    case actions.TOGGLE_IN_ARRAY: 
    // No sirve para objetos 
    const index = state[domain] && state[domain][key] ? state[domain][key].indexOf(value) : -1 
    return index === -1 ? 
     { 
     ...state, 
     [domain]: { 
      ...state[domain] || {}, 
      [key]: [ 
      value, 
      ...state[domain][key] 
      ] 
     } 
     } : { 
     ...state, 
     [domain]: { 
      ...state[domain], 
      [key]: [ 
      ...state[domain][key].slice(0, index), 
      ...state[domain][key].slice(index + 1) 
      ] 
     } 
     } 
    case actions.DELETE: 
    return { 
     ...state, 
     [domain]: omit(state[domain], key) 
    } 
    case actions.CLEAR_DOMAIN: 
    return { 
     ...state, 
     [domain]: initialState[domain] 
    } 
    case actions.RESET_UI: 
    return { 
     ...initialState 
    } 
    default: 
    return state 
    } 
} 
+1

действия направляются все редукторы, так что вы можете справиться один тип действия на обоих редукторах –

+0

Да, благодарю Дэвина. Вы правы, и это может быть решением. Но у меня есть некоторые действия для модуля UI, такие как updateUIElement и некоторые для модуля фильтрации, такие как updateFilter. Оба модуля очень агностичны, и я повторно использую их между проектами, поэтому введение такого действия, как updateCalendar, мне не нравится. Наверное, нет способа, и я в конечном итоге сделаю что-то похожее на то, что ты сказал. Большое спасибо – kanedaki

+0

, если вы не собираетесь использовать действия globaly и хотите отправить несколько действий одновременно. Затем вы можете использовать https://github.com/tshelburne/redux-batched-actions –

ответ

0

Отправляется действия будут направлены все редукторами в корневой редуктор, который в свою очередь, передавались дочерним переходниками (в зависимости от реализации редуктора).

Таким образом, если ваш корневой редуктор выглядит следующим образом:

export default combineReducers({ 
    filters, 
    ui, 
}); 

Вы можете ответить на такие же действия, как это в каждом редукторе:

function filters(state, action) { 
    case CLICK_ON_DATE: 
    return { 
     ...state, 
     start: ..., 
     end: ..., 
    }; 
    ... 
} 


function ui(state, action) { 
    case CLICK_ON_DATE: 
    return { 
     ...state, 
     zoomLevel: 'week', 
    }; 
    ... 
} 
+0

Спасибо Ян, вы совершенно правы. Проблема в том, что я не могу изменить свои редукторы, потому что они разделяют между проектами, и они не должны знать о действиях в других модулях. Я добавил код редуктора ui, mayble, он уточнит, что я имею в виду под общим. – kanedaki

Смежные вопросы