首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由redux- action库导出的操作类型不可重用。

由redux- action库导出的操作类型不可重用。
EN

Stack Overflow用户
提问于 2018-08-15 02:39:50
回答 2查看 193关注 0票数 0

通常,我们将使用 redux -action库定义一个集合还原操作&还原器。

代码语言:javascript
复制
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 214E 115“CLOSE”E 216/code>、E 117“发送”E 218>

但是,如果我们想在switch语句中重用这些动作类型,我们必须以一种尴尬的方式将与''连接起来,这样才能传递开关快捷键。

在处理要求严格相等的===的开关语句解析时,有什么优雅的方法可以避免这种愚蠢的代码?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-10-01 13:38:19

我可能误解了你的问题,所以我以前的回答可能不会接近你想要的。

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

代码语言:javascript
复制
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 })
    }
}

更新

如果您需要强制执行严格的平等,并且不太关心遵循典型的/可爱的/整洁的模式,您可以使用以下方法:

代码语言:javascript
复制
// 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已经使用了严格的等式检查。

代码语言:javascript
复制
function match (arg) {
  switch(arg) {
    case 1: return "matched num"
    case '1': return "matched str"
  }
}

match(1) // -> matched num
match('1') // -> matched str
票数 1
EN

Stack Overflow用户

发布于 2018-10-01 13:02:40

一种方法是使用handleActionhandleActions函数,也是由redux操作提供的。而不是用switch案例编写一个长的[action.type]语句,而是将您的动作创建者映射到使用这些函数的减缩器。

这就像我喜欢这样做:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51852218

复制
相关文章

相似问题

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