2017-10-25 14 views
0

ここではredux-sagaに問題があります。サイドバーを開く/閉じるにはtoggleSidebar()と呼んでいます。しかし、それはうまくいかない。 reducersagaconsole.logを使用してコンソールにログしますが、コンソールにはreducerログだけが記録されます。redux-sagaのSagaは無視され、還元剤のみが使用されます

サイドバーが開きますが、なぜサガは無視されますか?

/sagas/templateSaga.jsは - コンソールにログ

export default (state = initialState, {type, data = ""}) => { 
    switch (type) { 
    case TOGGLE_SIDEBAR: { 
     console.log("Called toggleSidebar in reducer"); 
     return {...state, collapsed: data} 
    } 
    default: { 
     return { 
     ...state 
     } 
    } 
    } 
} 
-

import { FETCH_DEFAULT_TEMPLATE, RECEIVE_DEFAULT_TEMPLATE } from '../actions' 

function* toggleSidebar(action) { 
    console.log("Called toggleSidebar in Saga") 
    yield put({type: 'TOGGLE_SIDEBAR', data: action.payload}); 
} 


export default function* templateSaga() { 
    yield takeLatest("TOGGLE_SIDEBAR", toggleSidebar); 
} 

/reducers/templateReducer.jsコンソールにログインしていません

/actions/index.js

export const TOGGLE_SIDEBAR = 'TOGGLE_SIDEBAR' 
export const toggleSidebar = data => ({type: TOGGLE_SIDEBAR, data}) 

/reducers/index.js(rootReducer)

import templateReducer from './templateReducer' 

export default combineReducers({ 
    templateReducer 
}) 

/sagas/index.js(rootSaga)

import templateSaga from './templateSaga' 

export default function* rootSaga() { 
    yield all([ 
    ...templateSaga 
    ]) 
} 

マイストアのような構成ですその:おそらく/sagas/index.js

const mapStateToProps = state => ({ 
    template: state.templateReducer 
}) 
const mapDispatchToProps = dispatch => 
    bindActionCreators({ toggleSidebar }, dispatch) 


export default connect(mapStateToProps, mapDispatchToProps)(App); 

答えて

1

をエラー(rootSaga) ...templateSagaそうのようなfork(templateSaga)にを変更してください:

import createSagaMiddleware      from 'redux-saga' 
import rootReducer  from '../modules/reducers' 
import rootSaga from '../modules/sagas' 

const sagaMiddleware = createSagaMiddleware(rootSaga); 

const middleware = [ 
    sagaMiddleware, 
    routerMiddleware(history) 
] 

export const store = createStore(
    rootReducer, 
    applyMiddleware(...middleware) 
) 
sagaMiddleware.run(rootSaga) 

そして最後に、私のアプリでは、私が使用しています

import { fork } from 'redux-saga/effects' 
import { templateSaga } from './templateSaga' 

export default function* rootSaga() { 
    yield all([ 
    fork(templateSaga) 
    ]) 
} 

変更後export default function* templateSaga

export function* templateSaga() { 
    yield takeLatest("TOGGLE_SIDEBAR", toggleSidebar); 
} 

はまた、あなたが'TOGGLE_SIDEBAR'を取り、あらゆる面で

+0

すぐ右に同じタイプを派遣/sagas/templateSaga.jsのループのいくつかの種類があります。ちょうどループに気づいた。それは考えています。私はアクションをディスパッチして状態を変更したいだけです。 別のアクションタイプを作成する必要がありますか、別の方法がありますか?私はrootSagaのtemplateSaga()をインポートしています。これはアクションをリッスンしています。私はそれをtemplateSaga()関数で正しく呼び出す必要がありますか? – Dawg

+0

ここでは還元剤で行うべき状態を変更したい場合は、https://medium.freecodecamp.org/async-operations-using-redux-saga-2ba02ae077b3 –

+0

という本当に良い記事です。どのようにアプリケーションを構造化したいかによって異なりますが、基本的にコンポーネントの 'toggleSidebar'アクションを呼び出すだけで、減速機が起動されます。複雑な非同期通信には佐賀が必要です –

関連する問題