2016-08-04 38 views
1

嘗試從操作/還原器中調用操作失敗。我知道這是一種反模式,但我想要自定義日誌(將有一個日誌視圖)的應用程序中發生的事情。一個視圖將列出這些項目。來自還原器的反應呼叫記錄器操作

運行此我得到的錯誤:

Reducers may not dispatch actions

如果我理解正確的話,我應該使用的演員,但無法找到很好的例子。 就如何使可從減速和動作來觸發自定義記錄任何建議(工作從組件罰款)

動作/ log.js

import {appError} from './index'; 
import moment from 'moment' 
import {store} from '../containers/app'; 

// ------- LOG WHATS HAPPENING ------- 
export const LOG_ADD = 'LOG_ADD'; 

export function logAdd(item){ 
    return { 
     type: LOG_ADD, 
     item: item 
    } 
} 

export function triggerLog(log){ 
    return function (dispatch, getState) { 
    dispatch(logAdd(log)); 
    } 
} 

export const LOG_ITEM_ERROR = "logerror"; 
export const LOG_ITEM_NOTIFY = "lognotify"; 

export class Log { 

    constructor(type,title,msg1,msg2) { 
    this.date = moment().unix(); 
    this.type = type; 
    this.title = title; 
    this.msg1 = msg1; 
    this.msg2 = msg2; 
    } 

    static error(title,msg1,msg2){ 
    dispatch(triggerLog(new Log(LOG_ITEM_ERROR,title,msg1,msg2))); 
    } 

    static notify(title,msg1,msg2){ 
    store.dispatch(triggerLog(new Log(LOG_ITEM_NOTIFY,title,msg1,msg2))); 
    } 

} 

減速器/ version.js

export default function version(state = initialVersion,action){ 
    switch(action.type){ 
     case VERSION_RESPONSE: 
      if(action.json.UpdateRequired){ 
       console.log("FORCE UPDATE"); 
       Log.error('Version','Force update'); 
       //@TODO make sure app gets updated 
       return; 
      } 

      Log.notify('Version','Check complete'); 

      return Object.assign({}, state, { 
       isDone: true, 
       isFetching: false, 
       isValid: true 
      }) 

SOLUTION

升級反應原生0.30 不要在操作使用調度:

export function getVersion() { 
    return function (dispatch, getState) { 
     dispatch(mycall()); // <-- do not do this 

現在的代碼示例工程。

+0

redux devtools不適合你嗎? –

+0

來更明確地指定。這不是用於開發日誌,而是用於生產。應用程序將顯示這些日誌的顯示位置。 – roady

回答

1

如果您想發送非原語操作,您需要redux-thunk Redux也有nice example它正在使用這個thunkMiddleware。

如果您只想記錄狀態更改,則可以使用Chrome Redux plugin來使用此簡單的redux-logger中間件。

或者自己寫custom middleware

+0

來更清楚地指定。這不是用於開發日誌,而是用於生產。應用程序將顯示這些日誌的顯示位置。 所以我需要創建一個自定義的中間件,並在那裏有很多的開關,如果國家能夠登錄? – roady