Реагувати і 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
було побічних ефектів, щоб ви могли правильно переходити між різними станами.
Ви можете легко порушити вищевказані три, використовуючи нечисті функції в якості редукторів.
Далі взято безпосередньо з редукційних документів:
Це називається редуктором, тому що це тип функції, який ви перейшли б 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
тощо, тому виконання однакової функції з тими ж параметрами може мати різні результати залежно від побічних ефектів. Ось де редукція не зможе.