2016-08-04 40 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