通常我们会做以下事情来使用 redux-actions 库定义一组 redux action&reducer
export const {
open,
close,
send
} = createActions({
OPEN: payload => ({
payload
}),
CLOSE: payload => ({
payload
}),
SEND: payload => ({
payload,
})
});
export const combinedReducer = createActions({
[open]: (state, action) => { /*you do someting*/ },
[close]: (state, action) => { /*you do someting*/ },
[send]: (state, action) => { /*you do someting*/ }
});
/*in some where , we are going to handle the a triggered action type respectively in a switch statement.
but we have to use string concatenation to make the switch express strict equal pass , any graceful solution ? */
switch (action.type) {
case open + "":
//do someting
break;
case close + "":
//do someting
break;
case send + "":
//do someting
break;
}
但是,如果我们想在 switch 语句中重用这些操作类型,我们必须以如此尴尬的方式与 '' 连接,只是为了传递 switch 表达式。
在处理强制严格相等比较的 switch 语句解析时,是否有任何优雅的方法可以避免这种愚蠢的代码===
提前致谢。
最佳答案
我可能误解了你的问题,所以我之前的回答可能与你想要的不接近。
我使用的另一种技术,同时使用 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
关于javascript - redux-actions 库导出的操作类型无法重复使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852218/