javascript - redux-actions 库导出的操作类型无法重复使用

标签 javascript reactjs redux redux-actions

通常我们会做以下事情来使用 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;
}

上面生成的openclosesend变量实际上是function类型,它们的toString( ) 被 redux-action lib 覆盖以导出类似 "OPEN","CLOSE","send"

但是,如果我们想在 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/

相关文章:

javascript - 视频 JS 就绪事件和 IE8

javascript - 在 react 中设置按钮动画

javascript - 无法加载配置 "react"以从

javascript - array.map 中的 Redux mapDispatchToProps 访问操作

javascript - React/Redux 渲染一个每秒更新的列表

reactjs - 如何为具有自己状态的多个 React 组件重用相同的 Redux Saga?

javascript - GIF 未在 Edge 和 Internet Explorer 中显示

javascript - Twitter Bootstrap 轮播不滑动

javascript - 当我使用模板时,提交按钮在 angularjs 中不起作用

javascript - 正确使用表单和输入元素