reduxЯвляется управлением государственной библиотекой, как с другими рамкамиreactне имеет прямого отношения, поэтомуreduxмогут покинутьreactИспользование в других средах. Так как нет иreactсвязанная логическая связь, поэтомуreduxИсходный код очень чистый, цель состоит в том, чтобы хорошо управлять данными. и действительно вreactиспользуется в проектеredux, необходимо иметьreact-reduxв качестве разъема, для соединенияreactа такжеredux.
Я не виделreduxПеред исходным кодом, я думаю, посмотрите наreduxЭто должно быть очень сложно, потому что я училсяreduxКак использовать, когда это былоreduxОшеломлен таким количеством понятий. действительно просмотретьreduxКогда исходный код, вы найдетеreduxСодержание исходного кода довольно маленькое, объем кода также довольно небольшой, а качество кода довольно высокое, так что это очень полезный исходный код.
Структура каталогов
Вам не нужно смотреть на другие каталоги, просто посмотрите на него напрямую./srcБар:
.\РЕДУКС\СРЦ │ applyMiddleware.js │ bindActionCreators.js │ combReducers.js │ compose.js │ createStore.js │ index.js │ └─утилиты actionTypes.js isPlainObject.js предупреждение.js
index.jsпросто поставьapplyMiddleware.jsПодождите, пока коллекция не будет объединена и выставлена.utilsПоместите в него несколько вспомогательных функций. Таким образом, всего нужно прочитать пять документов, и эти пять документовreduxпять разоблаченныхAPI.
// index.js
import createStore from './createStore'
import combineReducers from './combineReducers'
import bindActionCreators from './bindActionCreators'
import applyMiddleware from './applyMiddleware'
import compose from './compose'
import warning from './utils/warning'
import __DO_NOT_USE__ActionTypes from './utils/actionTypes'
// 忽略内容
export {
createStore,
combineReducers,
bindActionCreators,
applyMiddleware,
compose,
__DO_NOT_USE__ActionTypes
}
compose.js
пятьAPIЕдинственная функция, которую можно использовать отдельно, — это функция композиции, обычно используемая в функциональном программировании.reduxСамо по себе это не имеет большого значения, давайте сначала разберемся с некоторыми концепциями функционального программирования:
чистая функцияэто функция, которая при одних и тех же входных данных всегда будет получать одинаковые выходные данные без каких-либо наблюдаемых побочных эффектов.кодовая комбинация
Код:
export default function compose(...funcs) {
if (funcs.length === 0) {
return arg => arg
}
if (funcs.length === 1) {
return funcs[0]
}
return funcs.reduce((a, b) => (...args) => a(b(...args)))
}
фактическиcomposeЧто делает функция?var a = fn1(fn2(fn3(fn4(x))))Этот метод вложенного вызова изменен наvar a = compose(fn1,fn2,fn3,fn4)(x)способ позвонить.
reduxизcomposeРеализация очень проста, используя массивreduceметод,reduceИспользование может относиться кmdn.
Основной код состоит всего из одного предложения:return funcs.reduce((a,b) => (..args) => a(b(...args)))
Хотя я часто пишуreduceфункция, но все еще немного сбивает с толку этот код, поэтому вот реальный пример, чтобы увидеть, как эта функция выполняется:
import {compose} from 'redux'
let x = 10
function fn1 (x) {return x + 1}
function fn2(x) {return x + 2}
function fn3(x) {return x + 3}
function fn4(x) {return x + 4}
// 假设我这里想求得这样的值
let a = fn1(fn2(fn3(fn4(x)))) // 10 + 4 + 3 + 2 + 1 = 20
// 根据compose的功能,我们可以把上面的这条式子改成如下:
let composeFn = compose(fn1, fn2, fn3, fn4)
let b = composeFn(x) // 理论上也应该得到20
посмотриcompose(fn1, fn2, fn3, fn4)согласно сcomposeИсходный код, по сути, выполняет:[fn1,fn2,fn3.fn4].reduce((a, b) => (...args) => a(b(...args)))
| какой цикл | стоимость | значение б | возвращаемое значение |
|---|---|---|---|
| первый цикл | fn1 | fn2 | (...args) => fn1(fn2(...args)) |
| второй цикл | (...args) => fn1(fn2(...args)) | fn3 | (...args) => fn1(fn2(fn3(...args))) |
| Третий раунд | (...args) => fn1(fn2(fn3(...args))) | fn4 | (...args) => fn1(fn2(fn3(fn4(...args)))) |
Окончательное возвращаемое значение цикла равно(...args) => fn1(fn2(fn3(fn4(...args)))). так послеcomposeПосле обработки функция принимает нужный нам формат.
Суммировать
composeФункции распространены в функциональном программировании. здесьreduxдаcomposeРеализация очень проста, но не так проста для понимания, в основном из-заArray.prototype.reduceФункция не настолько искусна, а второй способ написания принимающей функции и возвращающей функции вкупе с несколькими последовательными=>, легко увидеть головокружение.
ЭтоreduxПервая часть толкования, за которой следуют несколькоAPIПоговори об этом. особенноapplyMiddlewareэтоAPIполезно для этогоcomposeВ объединении промежуточного ПО тоже есть момент, который сложно понять.