Содержание
Зачем вообще switch
Когда вариантов развития событий больше двух-трёх, цепочкаif … else if … else if …
быстро превращается в «лапшу». Читать, поддерживать и особенно обновлять такую конструкцию физически больно.
Поэтому switch
решает проблему тем, что сразу очевидно:
- По какому выражению идёт ветвление.
- Список возможных исходов — все «case» у вас перед глазами.
- Обработчик по умолчанию (
default
), чтобы ничего не потерять.
Синтаксис switch case
switch (выражение) {
case значение1:
// код, если выражение === значение1 break;
case значение2: case значение3:
// код, если выражение равно 2 или 3 break;
default:
// код, если ни один case не подошёл }
Ключевые моменты:
break
завершает работу оператора; без него начнётся проваливание (fall-through).case
сравнивается строго (===
).default
необязателен, но спасает от «неучтённого» значения.
Как применяю в Тильде
Ниже реальный сценарий когда мне было удобно использовать switch case для определения на какую кнопку был осуществлен клик, далее происходило формирование донатного товара через стандартную форму тильды и в итоге в корзину добавлялся товар, ценой которого можно было управлять через отдельные кнопки или пользовательский ввод прямо в корзине. Само решение здесь Изменение стоимости доната \ пожертвования в тильде для фонда помощи \ благотворительности
/**
* Прячет форму донатов, находит все «донат-кнопки» и вешает на них обработчики
* (логику определяем в addDonateHandler → switch case).
*/
function find_old_button() {
/* --- прячем форму ------------------------------------------------------- */
const donate_form = document.querySelector(id_donate_form);
donate_form.style.display = 'none';
/* --- собираем группы кнопок + флаги активности ------------------------- */
const groups = [
{
type: 1,
active: button_type1_active,
nodes: document.querySelectorAll(class_button_type1 + ' .tn-atom'),
},
{
type: 2,
active: button_type2_active,
nodes: document.querySelectorAll(class_button_type2 + ' .tn-atom'),
},
{
type: 3,
active: button_type3_active,
nodes: document.querySelectorAll(class_button_type3 + ' a'),
},
{
type: 4,
active: button_type4_active,
nodes: document.querySelectorAll(class_button_type4 + ' a'),
},
];
/* --- вешаем обработчики только на «активные» группы -------------------- */
groups.forEach(({ type, active, nodes }) => {
if (!active) return; // флаг выключен — пропускаем
nodes.forEach((node) => addDonateHandler(node, type));
});
}
/**
* В зависимости от «типа» кнопки генерируем ссылку #order:XXX=YYY
* и программно «щёлкаем» по скрытой submit-кнопке формы.
*/
function addDonateHandler(node, type) {
node.addEventListener('click', (e) => {
let donate_link, decoded, text, sum;
switch (type) {
/* ------------------------------------------------------------------ */
case 1: { // «500 ₽ / 100» и т.п.
donate_link = getDonateLink();
const summ_button_type1 = node.innerText.match(/[0-9]+/); // число из текста
donate_link.href = `#order:${text_button_type1}=${summ_button_type1}`;
break;
}
/* ------------------------------------------------------------------ */
case 2: { // «Другая сумма»
donate_link = getDonateLink();
donate_link.href = `#order:${text_button_type2}=${summ_button_type2}`;
break;
}
/* ------------------------------------------------------------------ */
case 3: { // ссылка вида …#Название:::999
e.preventDefault();
donate_link = getDonateLink();
decoded = decodeURIComponent(node.href);
text = decoded.slice(decoded.indexOf('#') + 1, decoded.indexOf(':::'));
sum = decoded.split(':::')[1];
donate_link.href = `#order:${text}=${sum}`;
break;
}
/* ------------------------------------------------------------------ */
case 4: { // та же схема, но проверяем «:::» в href
if (!node.href.includes(':::')) return;
e.preventDefault();
donate_link = getDonateLink();
decoded = decodeURIComponent(node.href);
text = decoded.slice(decoded.indexOf('#') + 1, decoded.indexOf(':::'));
sum = decoded.split(':::')[1];
donate_link.href = `#order:${text}=${sum}`;
break;
}
}
/* если ссылка сформирована — «щёлкаем» submit формы */
if (donate_link) {
document.querySelector(id_donate_form + ' .t-submit')
.dispatchEvent(new Event('click'));
}
});
}
/* ──────────────────────────────────────────────────────────────────────────── */
/* вспомогалка: быстрая выборка скрытой ссылки внутри формы */
function getDonateLink() {
return document.querySelector(
id_donate_form + ' .t-form__submit .t811_link',
);
}
Что получили:
- Один точный взгляд показывает все варианты кнопок и действий к ним
- Отсутствуют вложенные
if
и «лесенка» изelse if
. - Легко добавить ещё один
case
, не путая условия.
Базовое сравнение с if … else
Задача | if … else | switch … case |
---|---|---|
2–3 ветки, разные условия | ✅ | ⚠️ лишняя форма |
4+ значений одного ключа | 🤯 длинная цепочка | ✅ список case |
Сравнение диапазонов (> / < ) | ✅ любая логика | ⚠️ надо хитрить |
Логика без повторяющихся break | — | ⚠️ легко забыть |
Когда switch
удобен
✔ Один «выбирающий» параметр
✔ Много (>3) вариантов с уникальным кодом.
✔ Явное fall-through (например, case 1:
→ case 2:
) для схожих действий.
Советы по стилю
- Сгруппируйте схожие
case
подряд и добавьте комментарий о fall-through. - Не забывайте
break
— ESLint-правилоno-fallthrough
спасёт от опечаток. - Если внутри
case
— больше двух-трёх строк, вынесите их в функцию:case 'USD': handleUSD(); break;
- Для диапазонов (
x > 100
) и сложных проверок оставайтесь наif
.
Вывод
switch
— отличный инструмент, когда речь про одно значение и много «дорог».
В Tilda он спасает в сценариях:
- выбор платёжного провайдера или типа доставки;
- нужно выбрать одну ветку среди множества как в примере статьи;
- подключение CSS/JS под конкретную страну или язык;
- обработка статусов API-запросов.
Хоть и конструкция хороша для поддержки, но самое главное правило должно быть с вами всегда «После того как напишите код, если через 2-3 месяца не работы с ним вы сможете его прочесть и быстро понять, что и как работает, значит код хорошо структурирован»
Как со мной связаться
Если вы не нашли для себя ответ в моих статьях или у вас есть задача, присылайте ваше ТЗ задание под ваш проект.
Пишите https://t.me/vbalakin буду рад помочь с доработкой.
Еще материалы
-
7 Теория try … catch в JavaScript — разбор на примере кода для Тильда
В JavaScript есть удобная конструкция try..catch, позволяющая обрабатывать ошибки (исключения). Используется он чаще для тех кусков кода, где важен точный
-
5 Условие if \ else в JavaScript + Tilda
Разбираем условные конструкции if, else и тернарный оператор в JavaScript для Tilda: наглядные примеры, готовый код и практические советы по оптимизации.
-
4 Арифметические операции и нюансы преобразований текста в числа и наоборот JS Tilda
К чему такой простой вопрос затронут? А все элементарно, часто при работе с расчетом скидок и промокодов для своих кастомных
-
3 Как объявлять переменные и функции JS в Тильде, чтобы не было проблем
Мы уже привыкли, что можем создавать свой JS код и называть внутри него переменные и функции, так как нам нужно.
-
2. Как логировать промежуточные результаты и еще console.log JS + Tilda
Вот бывает такое, все вроде бы должно работать, а не работает. Сам часто сталкиваюсь с ситуацией когда код написан, проверен
-
1. Как лучше добавлять JS в Тильда
Благодаря веку информационных технологий, мы можем делать все что угодно и как угодно, поэтому любые ваши действия будут правильными, просто