BorisovAI
Все публикации
Новая функцияscada-coatingClaude Code

Живое состояние ванн: от console.log к реальным callbacks в React

Живое состояние ванн: от console.log к реальным callbacks в React

Работал над SCADA Coating — системой мониторинга и управления промышленными ванами с покрытием. Проект на React, и сейчас нужно было превратить статический макет в живую панель управления.

Задача звучала просто: добавить callback props в EquipmentView и LineView, затем подключить все кнопки к реальным обработчикам вместо console.log. На практике это означало переложить состояние ванн из статического импорта в useState и синхронизировать изменения между тремя вкладками одновременно.

Кнопки, которые работают

Начал с таблицы ванн в EquipmentView. Здесь каждая строка — одна ванна с индикатором температуры, статусом нагрева и положением крышки. Две кнопки: переключение нагрева (ВКЛ/ВЫКЛ) и управление крышкой (ЗАКР/ОТКР). Каждая должна мгновенно обновить интерфейс и синхронизироваться со всеми остальными вкладками.

Потом добавил GroupControlBar — панель для массового управления. Здесь уже интереснее. Кнопки “ВСЕ ВКЛ” и “ВСЕ ВЫКЛ” для нагрева работают мгновенно — все 28 ванн переключаются разом. Но для открытия/закрытия крышек я выбрал другой подход: каждая крышка отчитывается через ~400 мс, одна за другой. Команда не блокируется, пользователь видит прогресс в реальном времени.

“ЗАПУСТИТЬ ДОЛИВ” работает ещё интереснее — ванны ниже 70% наполняются постепенно (5 шагов по ~250 мс каждый) с задержкой между ваннами. Это имитирует реальное поведение: не все устройства отзываются мгновенно, оборудование может быть неисправно, и система должна это выдержать.

Асинхронность без блокировок

Ключевой момент — неблокирующая модель. Когда пользователь нажимает кнопку дважды подряд, предыдущая операция отменяется через clearTimeout. Это критично для UX: команды не скапливаются в очереди, система остаётся отзывчивой.

Sidebar на вкладке “Линия” подключен к тому же состоянию — нагрев, крышка, мешалка. Изменения на одной вкладке видны везде.

Факт о React и управлении состоянием

Интересный момент: в больших Electron-приложениях и SCADA-системах часто используют глобальное состояние через Context API или Redux, чтобы синхронизировать данные между компонентами. Но для относительно небольших систем (28 ванн, несколько десятков параметров) обычный useState в родительском компоненте работает быстрее и требует меньше boilerplate. Главное — корректно структурировать callback props и избегать глубокой вложенности.

Теперь панель управления действительно живая: всё отзывается, состояние синхронизируется, и каждая команда имитирует реальное поведение оборудования.

😄 Кстати, что общего у Emacs и кота? Оба делают только то, что хотят, и игнорируют инструкции.

Метаданные

Session ID:
grouped_scada-coating_20260222_0742
Branch:
feature/variant-a-migration
Dev Joke
Что общего у Emacs и кота? Оба делают только то, что хотят, и игнорируют инструкции

Оцените материал

0/1000