2016-06-07 201 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