applyMiddleware¶
1 |
|
Mидлвар (middleware) - это предлагаемый способ расширения Redux с помощью настраиваемых функций. Mидлвар позволяет вам обернуть метод стора dispatch
для пользы и дела. Ключевой особенностью мидлвара является то, что они компонуемы. Несколько мидлваров можно объединить вместе, где каждый мидлвар не должен знать, что происходит до или после него в цепочке.
Наиболее распространенным случаем использования мидлваров является поддержка асинхронных экшенов без большого количества шаблонного кода или зависимости от библиотек типа Rx. Это позволяет вам вызывать асинхронные экшены помимо обычных экшенов.
Например, redux-thunk позволяет генераторам экшенов инвертировать управление вызывая функции. Они будут получать dispatch
как аргумент и могут вызывать его асинхронно. Такие функции называются преобразователями (thunks). Другим примером мидлвара является redux-promise. Он позволяет вам вызывать асинхронный экшен c Promise и вызывать обычные экшены, когда промис вернет resolve.
Mидлвары нельзя сравнивать с createStore
и это не фундаментальная часть архитектуры Redux, но, мы считаем, что достаточно полезно поддерживать их прямо в ядре. Таким образом, существует единственный стандартный способ расширить dispatch
в экосистеме и разные мидлвары могут конкурировать в выразительности и полезности.
Параметры¶
...middlewares
(arguments)- Функции, которые соответствуют Redux middleware API. Каждый мидлвар получает
dispatch
иgetState
функции в качестве именованных аргументов и возвращает функцию. Эта функция будет переданаnext
dispatch-методу мидлвара и, как ожидается, вернет функциюэкшена
, вызывающуюnext(action)
с возможно другим аргументом или позже или, возможно, не вызывая его вообще. Последний мидлвар в цепочке получит реальныйdispatch
метод стора в качествеnext
параметра, таким образом завершая цепочку. Следовательно, сигнатурой мидлвара является({ getState, dispatch }) => next => action
.
Возвращает¶
- (Function)
- Расширитель стора, который применяет полученный мидлвар. Сигнатурой расширителя стора является
createStore => createStore'
, но самый простой способ его применить - это передать его вcreateStore()
как последний аргументenhancer
.
Примеры¶
Мидлвар для кастомного логирования¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
Использование Thunk мидлвара для асинхронных экшенов¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
|
Советы¶
- Мидлвары всего лишь оборачивают метод стора
dispatch
. Технически, вы можете воспроизвести это поведение, оборачивая каждый вызовdispatch
вручную, но гораздо проще управлять этим из единого места и устанавливать трансформации экшенов во всём приложении одновременно. - Если вы используете другие расширители стора, помимо
applyMiddleware
, убедитесь, что вы расположилиapplyMiddleware
перед ними в цепочке преобразований, поскольку мидлвары потенциально могут быть асинхронными. Например, он должен быть установлен перед redux-devtools иначе DevTools не увидит сырые события, сгенерированные мидлваром Promise middleware и ему подобными. - Если вы ходите применять мидлвар по условию, убедитесь, что он импортируется только тогда, когда он необходим:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Это позволяет инструментам сборки эффективно удалять неиспользуемый код из сборки и уменьшать их размер.
- Никогда не задумывались, что из себя представляет
applyMiddleware
? Он должен быть более мощным механизмом расширения, чем сами мидлвары. И действительно,applyMiddleware
является примером наиболее мощного механизма расширения Redux, который называется расширители стора (store enhancers). Достаточно маловероятно, что вам когда-либо придётся самостоятельно писать расширитель стора. Примером такого расширителя является redux-devtools. мидлвар менее мощный, чем расширитель стора, но его проще написать. - Мидлвары представляются гораздо сложнее, чем они есть на самом деле. Единственный способ действительно понять мидлвар - это увидеть, как работают уже существующие, и попробовать написать собственный. Множественная вложенность функций может выглядеть пугающей, но большинство написанных мидлваров, фактически, содержат не больше 10 строк кода, а вложенность и компонуемость - это как раз то, что делает систему мидлваров такой мощной.
- Вы можете использовать
compose()
для применения нескольких расширителей стора одновременно.