2016-01-10 8 views
7

これは2つの州/レデューサーの間でデータを共有するための妥当な解決策ですか?2つのReduced/Regus間でデータを共有する

//combineReducers 
function coreReducer(state = {}, action){ 

    let filtersState = filters(state.filters, action); 
    let eventsState = events(state.events, action, { filters: filtersState}); 

    return { events: eventsState, filters : filtersState}; 

} 

export const rootReducer = combineReducers(
    { 
     core : coreReducer, 
     users 
    } 
); 

もしそうなら、どのように1は同じ送出されたイベントへの答えと第2還元機能の両方が、最初の1の新しい状態に依存する場合、減速機能が実行される順序を保証することができますか?

SET_FILTERイベントをディスパッチして、フィルタストアのactiveFiltersコレクションに追加し、その後、イベントストア内の項目の表示をactiveFilters値に対して変更するとします。得られたデータをコンピューティング - -

//ActiveFilters reducer 
function filtersActions(state = {}, action){ 

    switch (action.type) { 
     case SET_FILTER: 
      return Object.assign({}, state, { 
       [action.filterType]: action.filter 
      }) 
     case REMOVE_FILTER: 
      var temp = Object.assign({}, state); 
      delete temp[action.filterType]; 
      return temp; 

     case REMOVE_ALL_FILTERS: 
      return {}; 

     default: 
      return state 
    } 
} 

は、私は答えを見つけたと思う選択し直し

http://redux.js.org/docs/recipes/ComputingDerivedData.html

+1

これは理想的とは言えそうです。レデューサーは国家と行動の関数でなければならない。 3番目の議論をイベントリデューサーに渡すことは、一義的です。ここで何が起こっているの詳細を見るのに役立ちます。 'filters'と' events'リデューサーはどのように見えますか? –

+0

こんにちは!あなたは、再選択を使って還元剤の間で状態を分けましたか?どうやったの? –

+0

まあ、 'mapStateToProps'を使って別の解決策を見つけた posted down – Gorilla

答えて

0
/--------container--------/ 
import {getGroupsAndMembers} from '../reducers' 
const mapStateToProps = (state) => { 
    return { 
    inputValue: state.router.location.pathname.substring(1), 
    initialState: getGroupsAndMembers(state) <-- this one 
} 
} 


/--------reducers--------/ 
export function getGroupsAndMembers(state){ 
    let { groups, members } = JSON.parse(state) 
    response = {groups, members} 
    return response; 
} 


GroupsContainer.propTypes = { 
//React Redux injection 
pushState: PropTypes.func.isRequired, 
// Injected by React Router 
children: PropTypes.node, 
initialState:PropTypes.object, 
} 

は、 '接続' のガイドラインに従うことを忘れないでください

export default connect(mapStateToProps,{ pushState })(GroupsContainer) 
0

2つの減速機があり、1つが減速機の値に依存している場合は、それらを慎重に、そして最善の解決策は、最初にフィルタリングを設定し、次に対応するイベントを照会する特別な関数を使用することになります。また、イベントの取得が非同期操作である場合は、フィルタリングタイプに基づいてネストする必要があります。そうしないと、競合状態が発生し、間違ったイベントが発生します。生の再来の冗長性に対処するための

I have created a library redux-tilesので、私はこの例では、それを使用します。

import { createSyncTile, createTile } from 'redux-tiles'; 

const filtering = createSyncTile({ 
    type: ['ui', 'filtering'], 
    fn: ({ params }) => params.type, 
}); 

const events = createTile({ 
    type: ['api', 'events'], 
    fn: ({ api, params }) => api.get('/events', { type: params.type }), 
    nesting: ({ type }) => [type], 
}); 

// this function will just fetch events, but we will connect to apiEvents 
// and filter by type 
const fetchEvents = createTile({ 
    type: ['api', 'fetchEvents'], 
    fn: ({ selectors, getState, dispatch, actions }) => { 
    const type = selectors.ui.filtering(getState()); 
    return dispatch(actions.api.events({ type })); 
    }, 
}); 
関連する問題