2016-06-07 197 views
1

我實現與終極版的反應,我得到了相同名稱的嵌套狀態(見圖片)具有相同名稱

enter image description here

這裏嵌套狀態是我的減速器:

function helps(state = { 
    isFetching: false, 
    items: [] 
}, action) { 
    switch (action.type) { 
    case types.HELPS_FEED_REQUEST: 
     return Object.assign({}, state, { 
     isFetching: true 
     }); 
    case types.HELPS_FEED_SUCCESS: 
     return Object.assign({}, state, { 
     isFetching: false, 
     items: [ 
      ...state.items, 
      ...action.items 
     ] 
     }); 
    default: 
     return state; 
    } 
} 

const rootReducer = combineReducers({ 
    helps 
}); 

export default rootReducer; 

index.js減速器:

import {combineReducers} from 'redux'; 
import help from './helpReducer'; 
import helps from './helpsReducer'; 


const rootReducer = combineReducers({ 
    help, 
    helps 
}); 

export default rootReducer; 

我的問題是:爲什麼我不只有o ñ「幫助」狀態與isFetching和項目?有什麼明顯的我失蹤了?

編輯:

顯然,這是因爲我使用的減壓器結合。所以,如果我改變函數的名稱,例如helps_feed,國家將:

helps 
-- helps_feed 

爲什麼combineReducers使嵌套狀態?

configureStore.js

import { createStore, applyMiddleware, compose } from 'redux'; 
import rootReducer from '../reducers'; 
import createSagaMiddleware, {END} from 'redux-saga'; 
import helpSagas from '../sagas/helpSaga'; 

export default function configureStore(initialState) { 
    const rootSagas = [ 
    helpSagas 
    ]; 
    const sagaMiddleWare = createSagaMiddleware(); 

    const store = createStore(
    rootReducer, 
    initialState, 
    compose(
     applyMiddleware(sagaMiddleWare), 
     window.devToolsExtension ? window.devToolsExtension() : f => f 
)); 

    store.runSaga = sagaMiddleWare.run(...rootSagas); 
    store.close =() => store.dispatch(END); 
    return store; 
} 
+0

沒有足夠的信息來幫助你,你可以顯示在其中創建該文件的商店? – QoP

+0

@QoP我更新了我的問題。 –

回答

2

combineReducers創建與您傳遞給它的減速一個新的對象,那就是你所得到的原因,你的狀態嵌套。

要修復它,不使用combineReducers輸出reducer,因爲您沒有組合任何reducer。

function helps(state = { 
    isFetching: false, 
    items: [] 
}, action) { 
    switch (action.type) { 
    case types.HELPS_FEED_REQUEST: 
     return Object.assign({}, state, { 
     isFetching: true 
     }); 
    case types.HELPS_FEED_SUCCESS: 
     return Object.assign({}, state, { 
     isFetching: false, 
     items: [ 
      ...state.items, 
      ...action.items 
     ] 
     }); 
    default: 
     return state; 
    } 
} 

export default helps; 

具有多個combineReader的情景。

rootReducer.js

import auth from './auth' 
import trainer from './trainer/trainerReducer' 
import athlete from './athlete/athleteReducer' 

const rootReducer = combineReducers({ 
    auth, 
    trainer, 
    athlete 
}); 

trainerReducer.js

import { combineReducers } from 'redux' 
import manageAthletes from './manageAthletes' 
import manageRoutines from './manageRoutines' 

const trainerReducer = combineReducers({ 
    manageRoutines, 
    manageAthletes 
}); 

export default trainerReducer; 

athleteReducer

import trainer from './trainer' 
import routine from './routine' 

const athleteReducer = combineReducers({ 
    trainer, 
    routine 
}); 

export default athleteReducer; 
+0

這是有道理的。但聯合收割機應該只應用一次?我在這裏看到一個例子:https://github.com/reactjs/redux/blob/master/examples/shopping-cart/reducers/ 它有多個combineReducers()。爲什麼不在index.js中只使用一個combineReducers? –

+0

您可以隨意多次應用它,它可以讓您的狀態更「獨立」,正如您在示例中添加到答案中所示:-P。 – QoP