Javascript redux操作库导出的操作类型无法重复使用
通常,我们将使用redux actions库定义一组redux action&reducerJavascript redux操作库导出的操作类型无法重复使用,javascript,reactjs,redux,redux-actions,Javascript,Reactjs,Redux,Redux Actions,通常,我们将使用redux actions库定义一组redux action&reducer 导出常量{ 打开 接近, 发送 }=创建操作({ 打开:有效负载=>({ 有效载荷 }), 关闭:有效负载=>({ 有效载荷 }), 发送:有效负载=>({ 有效载荷, }) }); 导出常量combinedReducer=createActions({ [打开]:(状态,动作)=>{/*你做了些什么*/}, [关闭]:(状态,动作)=>{/*你做了些什么*/}, [send]:(状态、操作)=>{/
导出常量{
打开
接近,
发送
}=创建操作({
打开:有效负载=>({
有效载荷
}),
关闭:有效负载=>({
有效载荷
}),
发送:有效负载=>({
有效载荷,
})
});
导出常量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()。在引擎盖下键入。您的评论和演示给了我很多启发,谢谢。