Якщо ви вважаєте низку дій у вашому додатку схожими на список або, можливо, більше як на потік, це може мати більше сенсу.
Візьмемо цей надуманий приклад:
['apple', 'banana', 'cherry'].reduce((acc, item) => acc + item.length, 0)
Перший аргумент - це функція форми (Int, String) => Int
. Разом з початковим значенням ви проходитеreduce
те, що можна було б назвати "функцією редуктора", і отримуєте результат обробки серії елементів. Отже, можна сказати, функція редуктора описує, що робиться з кожним наступним окремим елементом для зміни результату. Іншими словами, функція редуктора приймає попередні вихідні та наступні значення і обчислює наступний вихідний результат.
Це аналогічно тому, що робить редуктор Redux: він бере попередній стан і поточну дію, і обчислює наступний стан.
У справжньому функціональному стилі програмування ви можете концептуально стерти значення, що застосовується до аргументів та результату, і просто зосередитись на "формі" входів та результатів.
На практиці редуктори Redux зазвичай є ортогональними, в тому сенсі, що для даної дії вони не всі вносять зміни до одних і тих же властивостей, що полегшує розподіл їх обов’язків та агрегування результату combineReducers
.
reduce
, яка має доступ до значення за замовчуванням та іншого значення, і повертає вам потенційно трансформоване значення за замовчуванням.state -> action -> state