通常,我们将使用 redux -action库定义一个集合还原操作&还原器。
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;
}
上面生成的变量open、、send实际上是函数类型,它们的toString()E 212被redux-action lib覆盖以导出一个字符串,如E 113“OPEN”E 214、E 115“CLOSE”E 216/code>、E 117“发送”E 218>
但是,如果我们想在switch语句中重用这些动作类型,我们必须以一种尴尬的方式将与''连接起来,这样才能传递开关快捷键。
在处理要求严格相等的===的开关语句解析时,有什么优雅的方法可以避免这种愚蠢的代码?
提前谢谢。
发布于 2018-10-01 13:38:19
我可能误解了你的问题,所以我以前的回答可能不会接近你想要的。
我使用过的另一种技术(同时使用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发布于 2018-10-01 13:02:40
一种方法是使用handleAction或handleActions函数,也是由redux操作提供的。而不是用switch案例编写一个长的[action.type]语句,而是将您的动作创建者映射到使用这些函数的减缩器。
这就像我喜欢这样做:
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函数文档位于这里:https://redux-actions.js.org/api/handleaction。
https://stackoverflow.com/questions/51852218
复制相似问题