Как динамически генерировать раскрывающийся список из вложенного массива в ReactJS

Я могу без проблем сделать вложенный выпадающий список, но я понятия не имею, как сделать его динамическим. Он может идти даже до 5-8 уровней в глубину. Я понимаю, что это можно сделать с помощью функции .map(), которая будет вызываться внутри себя снова, если есть еще какие-то подвыпадающие списки. Таким образом, я мог получить доступ ко всем данным, но что делать дальше, я не знаю.

Массив выглядит примерно так (только его часть):

categories = [
  {
    title : "Electronics", path : "Electronics", id : 1, subCat: [
      {title : "Computers", path : "Electronics->Computers", id : 11, subCat: [
        {title : "Desktop", path : "Electronics->Computers->Desktop", id : 111, subCat: [
          {title : "Gaming", path : "Electronics->Computers->Desktop->Gaming", id : 1111, subCat: null},
          {title : "Office", path : "Electronics->Computers->Desktop->Office", id : 1112, subCat: null}
        ]},
        {title : "Laptops", path : "Electronics->Computers->Laptops", id : 112, subCat: [
          {title : "Gaming", path : "Electronics->Computers->Laptops->Gaming", id : 1121, subCat: null},
          {title : "Office", path : "Electronics->Computers->Laptops->Office", id : 1122, subCat: null}
        ]}
      ]}
    ]
  },
  {
    title : "Cars", path : "Cars", id : 2, subCat: [
      {title : "Parts & Accessories", path : "Cars->Parts & Accessories", id : 21, subCat: [
        {title : "Car Parts", path : "Cars->Parts & Accessories->Car Parts", id : 211, subCat: null},
        {title : "Car Accessories", path : "Cars->Parts & Accessories->Car Accessories", id : 211, subCat: null},
        {title : "Parts", path : "Cars->Parts & Accessories->Parts", id : 212, subCat: null},
        {title : "Paintwork", path : "Cars->Parts & Accessories->Paintwork", id : 213, subCat: null},
        {title : "Tyres & Rims", path : "Cars->Parts & Accessories->Tyres & Rims", id : 214, subCat: [
          {title : "Tyres", path : "Cars->Parts & Accessories->Tyres & Rims->Tyres", id : 2141, subCat: null},
          {title : "Rims", path : "Cars->Parts & Accessories->Tyres & Rims->Rims", id : 2142, subCat: null},
          {title : "Trims", path : "Cars->Parts & Accessories->Tyres & Rims->Trims", id : 2143, subCat: null},
          {title : "Accessories", path : "Cars->Parts & Accessories->Tyres & Rims->Accessories", id : 2144, subCat: [
            {title : "Hub Centre Caps", path : "Cars->Parts & Accessories->Tyres & Rims->Accessories->Hub Centre Caps", id : 21441, subCat: null},
            {title : "Valve Caps", path : "Cars->Parts & Accessories->Tyres & Rims->Accessories->Valve Caps", id : 21442, subCat: null},
            {title : "Tyre Bags", path : "Cars->Parts & Accessories->Tyres & Rims->Accessories->Tyre Bags", id : 21443, subCat: null}
            {title : "Bolts & Nut Covers", path : "Cars->Parts & Accessories->Tyres & Rims->Accessories->Bolts & Nut Covers", id : 21444, subCat: null}
          ]},
        ]}
      ]}
    ]
  }
]

Может ли кто-нибудь помочь мне здесь, пожалуйста, с какой-нибудь идеей или примером? Спасибо.

Поделитесь фрагментом кода, который у вас есть до сих пор

Baboo 12.03.2019 13:58

Не могли бы вы предоставить данные, которые вы используете для вложения?

Avanthika 12.03.2019 13:58

Можете ли вы добавить исходный код?

Sania Khushbakht Jamil 12.03.2019 13:59

Добро пожаловать в Stack Overflow SlimEddy! Это не сервис по написанию кода. Похоже, у вас есть хорошее представление о подходе. Попробуйте это и вернитесь с конкретными вопросами, если вы не можете заставить его работать.

Tholle 12.03.2019 13:59

Пожалуйста, проверьте мой ответ здесь, он может решить вашу проблему: stackoverflow.com/questions/51004421/…. Таким образом, вы можете создавать неограниченное количество каскадных выпадающих списков.

gazdagergo 12.03.2019 14:07

Пока у меня нет ничего для динамического выпадающего списка. В моем файле у меня есть только функция map(), потому что я не знаю, что делать дальше. Но я добавил, как выглядит мой массив.

SlimEddy 12.03.2019 14:51

@gazdagergo Если я правильно понимаю, то для того, чтобы иметь выпадающий список, я должен использовать <DropDown options = {[ ]} /> каждый раз, верно? Значит, я должен сгенерировать новый массив из существующего, чтобы он имел <DropDown/> правильно?

SlimEddy 12.03.2019 15:10

Да, вы должны сгенерировать этот массив в коде JSX, чтобы вы могли добавить в него элемент JSX (<DropDown />). Если вы динамически получаете исходный массив с сервера в качестве опоры, я рекомендую использовать, например. getDerivedStateFromProps чтобы переназначить его и сохранить в состоянии. Это один из основных недостатков JSX, который заключается в том, что вы можете добавлять даже компоненты в массив или объект в качестве значения. Так почему бы не использовать его.

gazdagergo 12.03.2019 15:13

@gazdagergo немного поиграл со статическими данными, и все работает хорошо. Но есть ли способ отобразить {selectedOption} под выбранным параметром?

SlimEddy 12.03.2019 15:30

Если вы хотите отобразить выбранную опцию более глубоко вложенного раскрывающегося списка в родительском элементе, я рекомендую добавить onSelect prop к DropDown и передать функцию обработчика из верхнего родительского компонента. Внутри DropDown реализуйте некоторый обработчик, который вызывает это onSelect с выбранным значением. Например. запускается кликом или запускается измененным состоянием selectedOption.

gazdagergo 12.03.2019 15:36

@SlimEddy, вы нашли какие-нибудь ответы полезными?

gazdagergo 13.03.2019 12:33

@gazdagergo Ваш комментарий более полезен, чем текущий ответ. Но в вашем комментарии нужно сделать несколько мыслей, прежде чем он сможет добиться успеха, например, воссоздать массив с сервера, и этого шага не должно быть. Поэтому я пытаюсь использовать ваш пример, потому что у меня все равно нет других, и заставить его работать по-моему. И пытаюсь добавить правильный способ отображения дочерних элементов под правильным родителем. Спасибо, в любом случае.

SlimEddy 16.03.2019 14:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
12
820
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы хотите сделать что-то, что может быть динамически вложено, вы можете создать компонент, который может отображать себя, а затем передавать текущий уровень элементов для визуализации.

Если вы посмотрите на этот простой пример: https://codesandbox.io/s/rln82loyj4?fontsize=14

Первоначально он отображает один компонент и дает ему массив строк и массивов. В компоненте он просматривает каждый элемент и проверяет, является ли он массивом или нет. Если это массив, он создаст еще один элемент, но увеличит уровень и предоставит следующую группу элементов для сопоставления. Уровень в настоящее время используется для установки поля слева, чтобы он выглядел многоуровневым.

Это довольно простой пример, но концепция должна быть применима к тому, что вы хотите - лучший способ решить вашу проблему - сделать что-то рекурсивным.

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