例如,使用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;
}
}
这有什么不利之处吗?或者这是个好主意?对它或它没有多大反对意见
答案 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。