(high) ZouitLayer.tsx/ZouitLayer: хеш-сегмент React-key константен для Polygon — старая геометрия ЗОУИТ остаётся на карте #1455

Closed
opened 2026-06-15 05:55:53 +00:00 by bot-backend · 1 comment
Collaborator

Severity: high · Категория: frontend · Файл: frontend/src/components/site-finder/ZouitLayer.tsx:210-213

ZouitLayer.tsx:210-213. React-key слоя = zouit-${sev}-${idx}-${overlap.geom_geojson?.slice(0,24) ?? ""}. Проверено: первые 24 символа ЛЮБОГО Polygon-GeoJSON = константа {"type":"Polygon","coord (отличается только MultiPolygon → {"type":"MultiPolygon",). То есть hash-сегмент не зависит от самой геометрии полигона. Комментарий в коде (стр. 207-209) прямо заявляет, что хеш в key нужен чтобы форсировать remount react-leaflet GeoJSON при смене участка (компонент кэширует слой и игнорирует смену data prop). Для обычных Polygon (самый частый случай) key фактически = zouit-${sev}-${idx}-{"type":"Polygon","coord, где idx позиционный. При переключении участка A→B с тем же числом blocker/warning-полигонов в том же порядке ключи совпадают → React переиспользует GeoJSON-компонент → геометрия не перерисовывается, на карте показываются охранные зоны предыдущего участка. Это ровно тот баг, который key должен был предотвратить. Импакт: пользователю показывают чужие ЗОУИТ (high — ложные данные на правовом слое участка). Фикс: включить в hash полную геометрию (JSON.stringify(geometry) или хеш всей строки geom_geojson, не slice(0,24)); либо завязать key на стабильный id участка + индекс overlap.id, а не на префикс типа геометрии.

Почему баг: Комментарий в коде прямо говорит, что хеш в key нужен, чтобы форсировать remount react-leaflet GeoJSON при смене участка (react-leaflet кэширует слой и не реагирует на смену data prop). Но для Polygon хеш-сегмент константен, а idx позиционный. При переключении с участка A на участок B, если у обоих одинаковое число blocker/warning-полигонов в том же порядке, ключи zouit-blocker-0-..., zouit-blocker-1-... совпадают → React переиспользует компонент GeoJSON → геометрия НЕ перерисовывается, на карте показываются охранные зоны предыдущего участка. Это ровно тот баг, который key должен был предотвратить. (MultiPolygon-префикс {"type":"MultiPolygon", отличается, поэтому проявляется для самых частых — обычных Polygon.)

Как чинить: Включить в key реально различающую часть геометрии: например хеш полной строки overlap.geom_geojson или её длину+конец, либо стабильный id из overlap (если backend отдаёт zone id). Минимум — использовать overlap.geom_geojson целиком как key вместо первых 24 символов, либо добавить идентификатор участка (cadNum) в key.


deep-audit «армия ботов 2» · verify+harden, confidence 0.9 · unit U94

**Severity:** high · **Категория:** frontend · **Файл:** `frontend/src/components/site-finder/ZouitLayer.tsx:210-213` ZouitLayer.tsx:210-213. React-key слоя = `zouit-${sev}-${idx}-${overlap.geom_geojson?.slice(0,24) ?? ""}`. Проверено: первые 24 символа ЛЮБОГО Polygon-GeoJSON = константа `{"type":"Polygon","coord` (отличается только MultiPolygon → `{"type":"MultiPolygon",`). То есть hash-сегмент не зависит от самой геометрии полигона. Комментарий в коде (стр. 207-209) прямо заявляет, что хеш в key нужен чтобы форсировать remount react-leaflet GeoJSON при смене участка (компонент кэширует слой и игнорирует смену data prop). Для обычных Polygon (самый частый случай) key фактически = `zouit-${sev}-${idx}-{"type":"Polygon","coord`, где idx позиционный. При переключении участка A→B с тем же числом blocker/warning-полигонов в том же порядке ключи совпадают → React переиспользует GeoJSON-компонент → геометрия не перерисовывается, на карте показываются охранные зоны предыдущего участка. Это ровно тот баг, который key должен был предотвратить. Импакт: пользователю показывают чужие ЗОУИТ (high — ложные данные на правовом слое участка). Фикс: включить в hash полную геометрию (JSON.stringify(geometry) или хеш всей строки geom_geojson, не slice(0,24)); либо завязать key на стабильный id участка + индекс overlap.id, а не на префикс типа геометрии. **Почему баг:** Комментарий в коде прямо говорит, что хеш в key нужен, чтобы форсировать remount react-leaflet GeoJSON при смене участка (react-leaflet кэширует слой и не реагирует на смену data prop). Но для Polygon хеш-сегмент константен, а idx позиционный. При переключении с участка A на участок B, если у обоих одинаковое число blocker/warning-полигонов в том же порядке, ключи `zouit-blocker-0-...`, `zouit-blocker-1-...` совпадают → React переиспользует компонент GeoJSON → геометрия НЕ перерисовывается, на карте показываются охранные зоны предыдущего участка. Это ровно тот баг, который key должен был предотвратить. (MultiPolygon-префикс `{"type":"MultiPolygon",` отличается, поэтому проявляется для самых частых — обычных Polygon.) **Как чинить:** Включить в key реально различающую часть геометрии: например хеш полной строки `overlap.geom_geojson` или её длину+конец, либо стабильный id из overlap (если backend отдаёт zone id). Минимум — использовать `overlap.geom_geojson` целиком как key вместо первых 24 символов, либо добавить идентификатор участка (cadNum) в key. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.9 · unit U94</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:55:53 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:07 +00:00
Owner

🔍 week ревью 1 — верификация (НЕ ПОДТВЕРЖДЕНО)

Текущее состояние кода: Файл frontend/src/components/site-finder/ZouitLayer.tsx и компонент ZouitLayer в текущем коде не найдены (grep по frontend/src на ZouitLayer, zouit-${sev}, geom_geojson?.slice, «remount/форсировать» — пусто). Рендер ЗОУИТ-оверлапов сейчас — frontend/src/components/site-finder/NspdZouitOverlapsBlock.tsx (список, key=idx, без карты/GeoJSON-слоя, без geom-хеша).

Корень: Описанный дефект (константный префикс {"type":"Polygon","coord в geom_geojson.slice(0,24)) в текущем коде не воспроизводится — такого слоя нет. Аналогичный приём «geom в key для remount» существует только в MarketLayers.tsx:167/217/288 (risk/opp/redline), но там используется WKT (zone.geom_wkt.slice(0, 24)), а не GeoJSON. WKT-полигон начинается с POLYGON ((<координаты> — первые 24 символа СОДЕРЖАТ координатные цифры и различаются между полигонами, поэтому константности префикса (корня бага) там нет.

Что править:

  • Закрыть как устаревшее/неприменимое к текущему коду (компонент-цель не существует), либо переадресовать на NspdZouitOverlapsBlock.tsx если речь о другом рендере.
  • Если планируется будущий карта-слой ЗОУИТ — учесть урок: key должен включать различающую часть геометрии (полный geom_geojson или stable zone id), не префикс типа.

Что посмотреть:

  • Код: NspdZouitOverlapsBlock.tsx (текущий рендер ЗОУИТ), MarketLayers.tsx:160-167/205-217/280-288 (WKT-вариант приёма — не подвержен), SiteMap.tsx:348-353 (тот же remount-приём для изохрон).
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (НЕ ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** Файл `frontend/src/components/site-finder/ZouitLayer.tsx` и компонент `ZouitLayer` в текущем коде **не найдены** (grep по `frontend/src` на `ZouitLayer`, `zouit-${sev}`, `geom_geojson?.slice`, «remount/форсировать» — пусто). Рендер ЗОУИТ-оверлапов сейчас — `frontend/src/components/site-finder/NspdZouitOverlapsBlock.tsx` (список, key=`idx`, без карты/GeoJSON-слоя, без geom-хеша). **Корень:** Описанный дефект (константный префикс `{"type":"Polygon","coord` в `geom_geojson.slice(0,24)`) в текущем коде не воспроизводится — такого слоя нет. Аналогичный приём «geom в key для remount» существует только в `MarketLayers.tsx:167/217/288` (`risk`/`opp`/`redline`), но там используется **WKT** (`zone.geom_wkt.slice(0, 24)`), а не GeoJSON. WKT-полигон начинается с `POLYGON ((<координаты>` — первые 24 символа СОДЕРЖАТ координатные цифры и различаются между полигонами, поэтому константности префикса (корня бага) там нет. **Что править:** - Закрыть как устаревшее/неприменимое к текущему коду (компонент-цель не существует), либо переадресовать на `NspdZouitOverlapsBlock.tsx` если речь о другом рендере. - Если планируется будущий карта-слой ЗОУИТ — учесть урок: key должен включать различающую часть геометрии (полный `geom_geojson` или stable zone id), не префикс типа. **Что посмотреть:** - Код: `NspdZouitOverlapsBlock.tsx` (текущий рендер ЗОУИТ), `MarketLayers.tsx:160-167/205-217/280-288` (WKT-вариант приёма — не подвержен), `SiteMap.tsx:348-353` (тот же remount-приём для изохрон). - Vault: релевантных заметок не найдено.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1455
No description provided.