在redux中使用除字符串常量之外的其他内容作为操作类型是不是一个坏主意?

时间:2017-05-04 23:42:24

标签: redux

例如,使用new String包装器来防止名称冲突:

// actions/forms/types.js
export const SUBMIT = new String('SUBMIT');

// actions/tabs/types.js
export const SUBMIT = new String('SUBMIT');

因此,在编写减速器时...

// reducers/forms.js
import { SUBMIT as FORM_SUBMIT } from '../actions/forms/types.js'
import { SUBMIT as TAB_SUBMIT } from '../actions/tabs/types.js'

console.log(FORM_SUBMIT === TAB_SUBMIT); // false;
export default function (state, action) {
  switch (action.type) {
    case FORM_SUBMIT:
      // correctly handle only FORM_SUBMIT, and not TAB_SUBMIT
    default: return state;
  }
}

这有什么不利之处吗?或者这是个好主意?对它或它没有多大反对意见

1 个答案:

答案 0 :(得分:1)

这可能不是一个好主意,在几个层面上。

Redux本身并不关心action.type的价值 - 它只强制定义action.type。从那里开始,减速器逻辑如何做出决定取决于你。

我实际上并不熟悉使用new String()来生成不相等的引用,所以我不得不看一下。是的,根据这个例子,这似乎产生了有效的差异化比较:



const a = new String("abcd");
const b = new String("abcd");
const c = "abcd";
const d = "abcd";

function reducer(state, action) {
    switch(action.type) {
      case a: {
        console.log("a");
        break;
      }
      case b: {
        console.log("b");
        break;
      }
      case c: {
        console.log("c");
        break;
      }
      case d: {
        console.log("d");
        break;
      } 
    }
}

reducer(undefined, {type : a});
reducer(undefined, {type : b});
reducer(undefined, {type : "abcd"});




HOWEVER ...如果您尝试记录这些操作,或者在Redux DevTools中查看操作历史记录,您将无法直观地区分它们。 Redux的总体意图是使其能够直接跟踪已分派的操作以及何时执行。作为一名开发人员,你有很多方法可以颠覆这种意图,但你只会让自己变得更加困难。

至于其他而不是字符串,例如数字或符号,这些也是坏主意。数字在动作历史中不像字符串那样可读,并且符号不可序列化并且会导致调试问题。 (另请参阅Redux FAQ entry on why actions should be serializable

我目前正在撰写博客文章,讨论Redux需要的实际技术限制(及其原因),以及Redux 预期的使用方式,以及它如何使用&#39 ; s 可能使用Redux。我目前的目标是在下周初提前发布这个帖子。如果您有兴趣,请关注我的博客http://blog.isquaredsoftware.com