我在redux-devtools
演练中阅读:
你的 reducer 必须是纯净的并且没有副作用才能与 DevTools 一起正常工作。例如,即使在 reducer 中生成随机 ID 也会使其变得不纯且不确定。相反,请在动作创建者中执行此操作。
这些话是关于生成随机值的。但是,如何根据当前状态获取唯一值?例如,在将数据存储到当前状态时,将数组的长度作为元素的 ID。只要我不删除数组的任何值,它就保证是唯一的。这会使函数不纯吗?
或者,通过基于当前状态创建条件值,如下所示:
function reducer (state, action) {
if (state.isLocked) return state;
// calculate further
}
或者,更极端的是,通过定义一个仅存在于函数内部的值,例如:
{ type: 'CREATE_USER', age: 13 }
// it is predictable, always return the same value with same argument
function getAgeText(age) {
if (age < 5) return 'baby';
if (age < 20) return 'teenager';
if (age < 30) return 'mature';
if (age < 40) return 'old';
if (age < 50) return 'very old';
return 'astounding';
} // of course by assuming we have to use this function in case you
// ask, "Why don't get those values anywhere else and not in
// this reducer?"
function reducer (state, action) {
switch (action.type) {
case 'CREATE_USER':
return Object.assign({}, state, {
age: age, ageText: getAgeText(action.age)
});
default:
return state;
}
}
那么,这些例子是否使功能不纯?而且,如果不是,那么在 redux 中创建一个长而复杂的计算或重度嵌套的 reducer 是否是一种不好的做法,即使它仅从传递的值(状态和操作)中完成?