react-redux中具有相同名称的几个操作

时间:2017-12-05 15:42:29

标签: javascript reactjs react-redux react-redux-form

我有来自不同包的动作,这些包具有如下相同的名称:

import { bindActionCreators } from 'redux';
import { setActiveLanguage } from 'react-localize-redux';
import * as actionCreators from '../actions/actionCreators';
import * as toggleActions from '../actions/toggleActions';
import {actions as rrfActions} from 'react-redux-form';

function mapDispatchToProps(dispatch) {
    return bindActionCreators(
      {
        ...actionCreators,
        ...toggleActions,
        setActiveLanguage,
        ...rrfActions
      },
      dispatch);
  }

export default mapDispatchToProps

由于toggleActionsrrfActions都有toggle动作,嵌套rrfActions可以耍(?)来调用动作,但我无法阻止减速器听取相同的TOGGLE动作类型。除了没有针对所有连接组件的通用mapDispatchToProps之外,还有其他解决方法,而不是非常具体的组件

干杯!

3 个答案:

答案 0 :(得分:1)

相同的reducer侦听器通过redux的设计提供相同的动作类型。如果您希望不同的侦听器对您的操作负责,则该操作必须具有不同的类型。你为什么不想使用前缀/后缀?

MY_SIMPLE_ACTION
MY_SIMPLE_ACTION_AREA1
MY_SIMPLE_ACTION_AREA2

在行动调度员中,您可以传递指定区域的附加参数:

export function onDoSomething(param1, param2, referer) {
  return dispatch({
    type: MY_SIMPLE_ACTION + (referer ? `_${referer}` : ''),
    payload: { param1, param2 }
  })
}

答案 1 :(得分:0)

我解决这个问题的方法是重命名操作:

import { bindActionCreators } from 'redux';
import { setActiveLanguage } from 'react-localize-redux';
import * as actionCreators from '../actions/actionCreators';
import * as toggleActions from '../actions/toggleActions';
import { actions as rrfActions } from 'react-redux-form';

let renamedActions = {};
Object.keys(rrfActions).map((v,k)=> {
  renamedActions['rrf' + v.replace(/\b\w/g, l => l.toUpperCase())] = rrfActions[v]
  // toggle -> rrfToggle
  return null;
})

function mapDispatchToProps(dispatch) {
  return bindActionCreators(
    {
      ...actionCreators,
      ...toggleActions,
      setActiveLanguage,
      ...renamedActions
    },
    dispatch);
}

export default mapDispatchToProps

答案 2 :(得分:0)

首先,为操作常量的命名空间

const TOGGLE = 'namespace/TOGGLE'

然后,如果您这样定义减速器

const TOGGLE = 'namespace/TOGGLE'

switch (action.type) {
    case TOGGLE:
        // do_stuff
}

属性action.type的求值必须精确地为'namespace/TOGGLE'

react-redux-form 中的TOGGLE操作的值不太可能包含您唯一的名称空间,对吧?

您的减速器现在是安全的。


来源