Создание значения на основе текущего состояния или на основе определенного значения внутри редуктора делает чистую функцию нечистой?
Я читаю на redux-devtools
прохождение:
Ваши корректоры должны быть чистыми и не иметь побочных эффектов, чтобы правильно работать с DevTools. Например, даже генерация случайного идентификатора в редукторе делает его нечистым и недетерминированным. Вместо этого делайте это в действии создателей.
Эти слова говорят о генерации случайного значения. Но как насчет принятия уникальных значений на основе текущего состояния? Например, принимая длину массива в качестве идентификатора для элементов при сохранении данных в текущем состоянии. Пока я не удаляю никакое значение массива, он гарантированно будет уникальным. Это делает функцию нечистой?
Или, создав условное значение на основе текущего состояния, например:
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;
}
}
Итак, эти примеры делают функцию нечистой? И, если нет, то является ли плохой практикой в редуксе создание длинных сложных вычислений или сильно вложенных редукторов, даже если это делается только из переданного значения (состояния и действия)?
1 ответ
Обе функции редуктора являются детерминированными, потому что они всегда будут возвращать одни и те же новые состояния на основе одинаковых текущих состояний.