在Redux操作中减少混乱的方法是什么?

时间:2016-12-11 08:14:28

标签: javascript redux

在Redux中声明操作的常见模式是将常量赋给字符串。

const ACTION = 'ACTION';

但在现实世界中,这种方法会使您的应用操作变得臃肿。添加和编写这样的低级东西很难。我自己看到并写了许多荒谬的constants.js,它们只包含有限的字符串。嗯,这让我觉得老学校和COBOLish,但这对我这种方法的唯一好处。

我相信,对于现实生活应用来说,这不是一个好的模式。

您宣布和重复使用操作的方式是什么?

为什么Redux lib是这样设计的呢?

3 个答案:

答案 0 :(得分:3)

什么具体不是一个好模式?常量?字符串?

没有任何要求动作类型必须是字符串 - a convention。类型可以是符号,对象或可用于在代码中做出决策的任何其他内容。

FSAs are explicitly intended to be human-friendly,人类擅长阅读文字。

查看Reducing Boilerplate部分,例如action creator libraries中的任何一个。

答案 1 :(得分:1)

您可以使用redux-ducks提议使您的操作/缩减器更加模块化和可维护。没有更多constants.js文件充满了动作类型。

https://github.com/erikras/ducks-modular-redux

至于重用动作,你可以使用redux thunk / saga来创建动作链。通过这种方式,您可以多次重复使用操作。

答案 2 :(得分:1)

好吧就个人而言,我甚至因为声明一个常量文件而感到恼火。这让我的项目膨胀,捆绑大小不断增加。

我想说如果你有一个reducer为不同的动作做同样的工作,你一定要看看higher order reducers。该链接来自redux docs本身。

我将尝试在以下代码的帮助下解释这一点。

考虑一下我有的常量文件

export default RECEIVE_DICT_2 = 'RECEIVE_DICT_2'
export default RECEIVE_DICT_1 = 'RECEIVE_DICT_1'

考虑你有减速器

First Reducer

const state = {
   dict : {},
}

function firstReducer(state = state,action){
  switch(action.type){

    case 'RECEIVE_DICT_1':
      return Object.assign({},state,{
        dict : action.dict
     })
 }

Second Reducer

const state = {
   dict : {},
}
function secondReducer(state = state,action){
  switch(action.type){

    case 'RECEIVE_DICT_2': 
      return Object.assign({},state,{
        dict : action.dict
     })
 }

现在,如果您看到两个reducers完全相同,但在调度操作时,您需要指定每个键,因为我们在常量中指定了它。

所以你的行动就像

firstAction(dict){
return {
   action:'RECEIVE_DICT_1',
   dict
  }
}

secondAction(dict){
return {
   action:'RECEIVE_DICT_2',
   dict
  }
}

显然这是代码膨胀太多了。所以在这里我们可以使用更高阶的reducers并抛弃那个常量文件。

现在你的减速机就是这样的

export default function parentReducer(code){
 return function commons(state = state,action){
  switch(action.type){
    case `RECEIVE_DICT_${code}`:
      return Object.assign({},state,{
        dict : action.dict
      })
    }
  }
 }

我希望你能得到这张照片。您可以在我上面分享的链接中阅读更多相关信息。

相关问题