Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript redux操作库导出的操作类型无法重复使用_Javascript_Reactjs_Redux_Redux Actions - Fatal编程技术网

Javascript redux操作库导出的操作类型无法重复使用

Javascript redux操作库导出的操作类型无法重复使用,javascript,reactjs,redux,redux-actions,Javascript,Reactjs,Redux,Redux Actions,通常,我们将使用redux actions库定义一组redux action&reducer 导出常量{ 打开 接近, 发送 }=创建操作({ 打开:有效负载=>({ 有效载荷 }), 关闭:有效负载=>({ 有效载荷 }), 发送:有效负载=>({ 有效载荷, }) }); 导出常量combinedReducer=createActions({ [打开]:(状态,动作)=>{/*你做了些什么*/}, [关闭]:(状态,动作)=>{/*你做了些什么*/}, [send]:(状态、操作)=>{/

通常,我们将使用redux actions库定义一组redux action&reducer

导出常量{
打开
接近,
发送
}=创建操作({
打开:有效负载=>({
有效载荷
}),
关闭:有效负载=>({
有效载荷
}),
发送:有效负载=>({
有效载荷,
})
});
导出常量combinedReducer=createActions({
[打开]:(状态,动作)=>{/*你做了些什么*/},
[关闭]:(状态,动作)=>{/*你做了些什么*/},
[send]:(状态、操作)=>{/*您正在做某事*/}
});
/*在某些情况下,我们将在switch语句中分别处理触发的动作类型。
但是我们必须使用字符串连接来使开关表示严格相等的过程,有什么优美的解决方案吗*/
开关(动作类型){
案例开放+“”:
//做点什么
打破
案例关闭+“”:
//做点什么
打破
案例发送+“”:
//做点什么
打破

}
单向使用同样由redux actions提供的
handleAction
handleActions
功能。与使用
[action.type]
案例编写长的
switch
语句不同,您可以使用这些函数将动作创建者映射到还原器

这与我喜欢的做法相似:

import { createAction, handleActions } from 'redux-actions'

// your action creators
export const myAction = createAction('ACTION_TYPE`)

// your reducer (this example doesn't do anything useful)
const myReducer = (state, action) => Object.assign({}, state, { someValue: action.payload })

const sliceDefaultValue = {}
export const slice = handleActions({
    [myAction]: myReducer
}, sliceDefaultValue)

handleAction
函数文档位于此处:。

我可能误解了您的问题,因此我之前的回答可能与您的要求不符

我使用的另一种技术,同时使用
createActions()
switch/case
如下所示:

import { createAction } from 'redux-actions'

// your action creators
export const myAction = createAction('ACTION_TYPE')

// your store slice/reducers
const defaultSliceState = {}
export const slice = (state = defaultSliceState, action) => {
    switch(action.type) {
        case myAction().type:
            return Object.assign({}, state, { someValue: action.payload })
    }
}
更新 如果您需要强制执行严格的平等,并且不太关心以下典型/可爱/整洁的模式,您可以使用以下方法:

// your store slice/reducers
const ACTION_TYPE_1 = 'ACTION_TYPE_1'
const ACTION_TYPE_2 = 'ACTION_TYPE_2'
// add your action creators here: const myAction = createAction(ACTION_TYPE)
// ...

const defaultSliceState = {}
export const slice = (state = defaultSliceState, action) => {
    switch(true) {
        case action.type === ACTION_TYPE_1:
            return Object.assign({}, state, { someValue: action.payload })
        case action.type === ACTION_TYPE_2:
            return Object.assign({}, state, { otherValue: doSomething(action.payload) })
    }
}
。。。但如果你只关心严格的平等,你甚至不需要这样做。通过一个小实验,我发现
switch/case
已经使用了严格的平等性检查

function match (arg) {
  switch(arg) {
    case 1: return "matched num"
    case '1': return "matched str"
  }
}

match(1) // -> matched num
match('1') // -> matched str

您使用了与我类似的技术,而不是在我的示例中使用字符串连接,而是使用myAction().type,这对于switch语句来说仍然是一个丑陋而冗长的解决方案。我仅将此模式用作使用
case ACTION\u TYPE:etc()
和使用
handleActions({actionCreator:reducer()})
之间的中间步骤,因为我没有时间或测试覆盖率来重构整个reducer/模块。我的代码库还使用redux saga,它在任何地方都接受ActionCreator,您也可以使用ACTION_类型的字符串,我更喜欢这种模式。我没有检查,但我假设redux saga和redux actions使用
actionCreator()。在引擎盖下键入
。您的评论和演示给了我很多启发,谢谢。