Я создаю визуализацию диаграммы процесса с помощью ReactFlow с расширяемыми/свертываемыми узлами. При свертывании узлов (удалении предков или потомков) ребра, соединенные с удаленными узлами, очищаются непоследовательно — корректно работает только примерно в 4 случаях из 10.
Среда
reactflow: ^11.x
dagre: ^0.8.5
React: ^18.x
Текущее поведение
Когда я нажимаю кнопку свернуть (P- или C-) на узле:
Узлы каждый раз удаляются правильно
Ребра иногда остаются видимыми, плавая без исходных/целевых узлов
Это происходит периодически - примерно Частота сбоев 60 %
Ожидаемое поведение
Все ребра, соединенные с удаленными узлами, должны очищаться последовательно в 100 % случаев.
Структура кода
Логика удаления узла (свернуть)
Я создаю визуализацию диаграммы процесса с помощью ReactFlow с расширяемыми/свертываемыми узлами. При свертывании узлов (удалении предков или потомков) ребра, соединенные с удаленными узлами, очищаются непоследовательно — корректно работает только примерно в 4 случаях из 10. Среда [list] [*]reactflow: ^11.x [*]dagre: ^0.8.5 [*]React: ^18.x [/list] Текущее поведение Когда я нажимаю кнопку свернуть (P- или C-) на узле: [list] [*]Узлы каждый раз удаляются правильно [*]Ребра иногда остаются видимыми, плавая без исходных/целевых узлов [*]Это происходит периодически - примерно Частота сбоев 60 % [/list] Ожидаемое поведение Все ребра, соединенные с удаленными узлами, должны очищаться [b]последовательно в 100 % случаев[/b]. Структура кода Логика удаления узла (свернуть) [code]const handleExpand = useCallback( async (type, nodeId, action) => { if (action === 'collapse') { let nodesToRemove = []; if (type === 'parent') { nodesToRemove = collectAncestors(nodeId, edgesRef.current || []); } else { nodesToRemove = collectDescendants(nodeId, edgesRef.current || []); }
if (nodesToRemove.length > 0) { const nodesToRemoveSet = new Set(nodesToRemove);
[*][b]Текущий подход[/b] – работа со снимками состояния, фильтрация всего, а затем обновление обоих одновременно (по-прежнему 40 % успеха)
[/list] Вопросы [list] [*][b]Почему очистка границ работает непоследовательно?[/b] Существует ли состояние гонки с внутренним состоянием ReactFlow?
[*][b]Есть ли правильный способ атомарного обновления узлов и ребер[/b] в ReactFlow для обеспечения согласованности?
[*][b]Должен ли я использовать другой шаблон[/b] для удаления узлов и связанных с ними ребер?
[*][b]Может ли пересчет макета dagre мешать ребрам[/b] очистка?
[/list] Дополнительный контекст [list] [*]График может иметь сложные отношения (несколько родителей, несколько дочерних элементов) [*]Мы используем настраиваемые типы узлов с кнопками развернуть/свернуть [*]Позиционирование узлов вручную отслеживается отдельно (очищается при сворачивании) [*]Тип использования ребер: 'bezier' с пользовательским стилем [/list]