首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >react-redux中具有相同名称的多个操作

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

Stack Overflow用户
提问于 2017-12-05 23:42:29
回答 3查看 3K关注 0票数 1

我有来自不同包的动作,它们具有相同的名称,如下所示:

代码语言:javascript
复制
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可以做到这一点(?)来调用操作,但是我不能阻止reducers监听相同的TOGGLE操作类型。除了对所有连接的组件都没有通用的mapDispatchToProps之外,还有什么解决方法吗?

干杯!

EN

回答 3

Stack Overflow用户

发布于 2017-12-06 00:06:08

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

代码语言:javascript
复制
MY_SIMPLE_ACTION
MY_SIMPLE_ACTION_AREA1
MY_SIMPLE_ACTION_AREA2

在action dispatcher中,您可以传递一个指定区域的附加参数:

代码语言:javascript
复制
export function onDoSomething(param1, param2, referer) {
  return dispatch({
    type: MY_SIMPLE_ACTION + (referer ? `_${referer}` : ''),
    payload: { param1, param2 }
  })
}
票数 1
EN

Stack Overflow用户

发布于 2019-09-11 03:26:44

首先,命名操作常量的

代码语言:javascript
复制
const TOGGLE = 'namespace/TOGGLE'

然后,如果你这样定义你的reducer

代码语言:javascript
复制
const TOGGLE = 'namespace/TOGGLE'

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

属性action.type的计算结果必须精确到'namespace/TOGGLE'

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

你的减速机现在是安全的。

资料来源

票数 1
EN

Stack Overflow用户

发布于 2017-12-06 00:05:42

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47657447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档