Реагируйте, и Redux
оба нуждаются в чистых функциях в сочетании с неизменностью, чтобы работать предсказуемым образом.
Если вы не выполните эти две вещи, ваше приложение будет иметь ошибки, наиболее распространенными из которых являются React/Redux
неспособность отслеживать изменения и невозможность повторного рендеринга при ваших state/prop
изменениях.
С точки зрения React рассмотрим следующий пример:
let state = {
add: 0,
}
function render() {
//...
}
//pure function
function effects(state,action) {
//following immutability while updating state, not directly mutating the state.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
function shouldUpdate(s) {
if(s === state){
return false
}
return true
}
state = effects(state, 'addTen')if(shouldUpdate(state)) {
render();
}
Состояние удерживается объектом состояния, который имеет только добавленное свойство. Это приложение отображает свойство приложения. Он не всегда должен отображать состояние, когда что-то происходит, но должен проверять, произошло ли изменение в объекте состояния.
Таким образом, у нас есть функция эффектов, pure function
которую мы используем, чтобы влиять на наше состояние. Вы видите, что он возвращает новое состояние, когда состояние должно быть изменено, и возвращает то же самое состояние, когда никаких изменений не требуется.
У нас также есть shouldUpdate
функция, которая с помощью оператора === проверяет, совпадают ли старое и новое состояние.
Чтобы сделать ошибки с точки зрения React, вы можете сделать следующее:
function effects(state,action) {
doRandom(); // effects should only be called for updating state.
// Doing any other stuff here would make effects impure.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
Вы также можете делать ошибки, устанавливая состояние напрямую и не используя effects
функцию.
function doMistake(newValue) {
this.state = newValue
}
Выше не должно быть сделано, и только effects
функция должна использоваться, чтобы обновить состояние.
С точки зрения React, мы называем effects
как setState
.
Для Redux:
combineReducers
Утилита Redux проверяет изменения ссылок.
connect
Метод React-Redux генерирует компоненты, которые проверяют изменения ссылок как для корневого состояния, так и для возвращаемых значений из mapState
функций, чтобы увидеть, действительно ли обернутый компонент должен повторно визуализироваться.
- Отладка во времени требует, чтобы редуктор не
pure functions
имел побочных эффектов, чтобы вы могли правильно переключаться между различными состояниями.
Вы можете легко нарушить вышеперечисленные три, используя нечистые функции в качестве восстановителей.
Следующее взято непосредственно из документов Redx:
Это называется редуктором, потому что это тип функции, который вы передадите Array.prototype.reduce(reducer, ?initialValue)
.
Очень важно, чтобы редуктор оставался чистым. То, что вы никогда не должны делать внутри редуктора:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
Учитывая те же аргументы, он должен вычислить следующее состояние и вернуть его. Без сюрпризов. Никаких побочных эффектов. Нет вызовов API. Нет мутаций. Просто расчет.
window.getElementById
т.д., поэтому запуск одной и той же функции с одинаковыми параметрами может иметь разные результаты в зависимости от побочных эффектов. Который, где излишек потерпит неудачу.