switch(true)
в значительной степени является Psyduck Javascript; когда вы впервые сталкиваетесь с ним в дикой природе, он сразу же сбивает вас с толку; и это суперэффективно!
Но почему!?
вероятно, вы подумали, когда поняли, что он делает, решив вместо этого использовать предложения if-else. Я согласен, что обычно это лучшая идея, но я хотел бы представить один случай, который определенно лучше подходит для switch(true)
:
Сопоставление типов действий с шаблонами в редюсерах Redux!
Таким образом, этот метод можно использовать для обновления состояния в соответствии с шаблонами типа действия, а не для сопоставления строки типа действия с установленными значениями!
Но почему!?
это, наверное, то, что вы думаете прямо сейчас! Не волнуйтесь, я приготовил Полное исцеление, чтобы мы могли избавить вас от путаницы раз и навсегда. Итак, давайте рассмотрим конкретный вариант использования.
HttpReducer
Предположим, мы используем промежуточное ПО Redux (thunk/saga/redux-observables и т. д.) для обработки взаимодействий с API. В этом примере мы предположим, что у нас есть редюсер, который отслеживает запущенные запросы, успешные и неудачные действия, и что все они используют постфиксы :REQUEST
, :SUCCESS
и :FAILURE
соответственно.
Так, например, при извлечении пользовательских данных создатели действий будут генерировать действия с тремя следующими типами данных: FETCH_USER_DATA:REQUEST
, FETCH_USER_DATA:SUCCESS
и FETCH_USER_DATA:FAILURE
. Пока это, вероятно, знакомо большинству активных пользователей Flux.
Теперь предположим, что нам нужен редьюсер, который отслеживает текущие активные запросы, отправляет их по запросам и удаляет при неудачах и успехах. Реализация того, как это сделать, должна быть довольно тривиальной, поэтому вместо этого я сосредоточусь только на определении типов действий.
const httpReducer = (state, action) => { switch(true) { case action.type.includes(':REQUEST'): // logic for adding to request list case action.type.includes(':SUCCESS'): // logic for removing from request list case action.type.includes(':FAILURE'): // logic for removing from request list // and possibly some error handling? default: return state; } }
Сопоставление типа действия с шаблонами может быть элегантно выполнено с помощью switch(true)
. Немного лучше, чем куча предложений if-else, не так ли?
Урок усвоен... даже Псайдак может стать незаменимым членом команды!