是根据当前状态创建值还是基于reducer中定义的值创建纯函数不纯?

时间:2016-03-14 10:25:40

标签: redux pure-function

我在redux-devtools walkthrough上阅读:

  

您的减压器必须纯净且无副作用才能正常使用   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 即使它只是从传递的值(状态和动作)完成的?

1 个答案:

答案 0 :(得分:0)

两个reducer函数都是确定性的,因为它们总是会根据相同的当前状态返回相同的新状态。