Рекурсивное рисование дерева с помощью CSS

Я пытаюсь рекурсивно нарисовать дерево на основе набора данных. К каждому элементу уровня 0 добавляется класс category (с полужирным шрифтом), каждому элементу уровня 1 добавляется group и добавляется уровень 2 leaf. Это дерево можно нарисовать до двух уровней. Но когда я рекурсивно рисую дерево, все уровни получают жирный стиль, а наведение мыши также применяется ко всему, а не к каждому уровню.

Вот песочница, которая показывает оба дерева, одно нарисовано с помощью рекурсии, другое жестко закодировано с помощью css: https://codesandbox.io/s/tree-compared-9s828h

Может кто-нибудь сказать мне, что не так в рекурсивном подходе.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не визуализируйте детей внутри родителя. Визуализируйте их как новую строку, обернув оба фрагментом Fragment (<>...</>). Фрагмент не создает новый элемент DOM и позволяет рекурсивно отображать плоский список, например статическое дерево.

Код (песочница):

return (
  <>
    <div
      className = {`list-row level-${level} ${categoryType}`}
      onClick = {onClickNode}
      key = {`${node.key}`}
    >
      <div className = "list-item-holder">
        {hasChildren && (
          <div className = "list-item-expander-holder">
            <span
              className = {`expand-collapse-icon ${isLeaf ? '' : 'expand'}`}
            >
              <span className = "collapse-icon">
                <FontAwesomeIcon icon = "caret-down" />
              </span>
              <span className = "expand-icon">
                <FontAwesomeIcon icon = "caret-right" />
              </span>
            </span>
          </div>
        )}
        <div className = "list-item-details-holder">{node.name}</div>
      </div>
    </div>
    {hasChildren && (
      <div className = "list-row-children">
        {node.categories.map((category) => renderNode(category, level + 1))}
      </div>
    )}
  </>
);

Ори Дори, спасибо за ответ, каким-то образом level-1 элементы приближаются к крайнему левому краю по сравнению с жестко запрограммированным деревом. Рассмотрим, Windows и VS Code. Также как я могу динамически расширять и сворачивать каждый элемент? . codeandbox.io/s/tree-compared-forked-bqgjq2?file=/src/data.‌​js

user21728514 27.04.2023 21:15

Вам нужно добавить правильные правила CSS для каждого уровня. Обратите внимание, что теперь у вас также есть уровень 3. Чтобы динамически разворачиваться и сворачиваться, вам нужно создать компонент с состоянием для уровня.

Ori Drori 27.04.2023 21:17

Создайте компонент для уровней. Компонент должен содержать JSX текущего элемента и дочерних элементов. Каждый компонент должен иметь открытое состояние (useState()), и вы можете переключать состояние, щелкая уровень.

Ori Drori 27.04.2023 21:21

Смотрите обновленную песочницу. Обратите внимание, как я преобразовал функцию в компонент с состоянием.

Ori Drori 27.04.2023 21:50

Другие вопросы по теме