Настройка динамического меню с объектами API json?

Я не уверен, что я мог бы сделать, чтобы эта работа работала... Поэтому я вызываю данные API (которые представляют собой просто набор вложенных объектов json), чтобы создать меню. Пока у меня работает так, что рендерит первый слой объектов (первое изображение), и когда вы нажимаете на каждый элемент, под ним появляется следующий уровень (второе изображение). Это работает рекурсивно, поэтому я предполагаю, что это работает для следующего уровня вниз, когда я нажимаю на элемент на «уровне 2», но это не так.

Может ли кто-нибудь увидеть, что я могу изменить в своем коде, чтобы это заработало?

class Menu extends React.Component {
  state = {
    categories: [],
    list: ""
  };


  //handle displaying list of values when clicking on button
  //search for list of values within object
  handleSearch = (obj, next, event) => {
    // console.info(event.target.name);
    Object.keys(obj).forEach(key => {
      if (typeof obj[key] === "object") {
        if (next === key) {
          //create DOM  CHILDREN
          createData(Object.keys(obj[key]), key, this.test, event);
        }
        this.handleSearch(obj[key], next);
      }
    });
  };

  componentDidMount() {
    axios.get("https://www.ifixit.com/api/2.0/categories").then(response => {
      this.setState({ categories: response.data });
    });
  }

  render() {
    return (
      <React.Fragment>
        {/* display list of things */}
        <div className = "columns is-multiline">
          {Object.keys(this.state.categories).map(key => (
            <div className = "column is-4">
              <div
                onClick = {event =>
                  this.handleSearch(this.state.categories, key, event)
                }
              >
                {key}
              </div>
              <div name = {key + "1"} />
            </div>
          ))}
        </div>
      </React.Fragment>
    );
  }
}

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

var index = 1;
export function createData(data, key, search, e) {
  e.stopPropagation();
  let parent = document.getElementsByName(key + "1");

  //create elements and append them
  for (let i = 0; i < data.length; i++) {
    let wrapper = document.createElement("ul");
    wrapper.innerHTML = data[i];
    wrapper.name = data[i] + index + 1;
    wrapper.addEventListener("click", search(data[i]));
    parent[0].append(wrapper);
  }
}

Настройка динамического меню с объектами API json?Настройка динамического меню с объектами API json?

вот скриншот "категорий" в консоли (объекты внутри объектов внутри объектов) Настройка динамического меню с объектами API json?

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

Dennis Vash 10.05.2019 19:09

@DennisVash Я добавил скриншот того, как выглядят категории, когда я делаю console.info

Emily 10.05.2019 19:23
Поведение ключевого слова "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
2
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны стараться избегать манипулирования DOM, создавая/добавляя элементы с помощью vanilla JS при использовании React, если это возможно. Одной из его основных сильных сторон является виртуальный DOM, который управляет рендерингом для вас и избегает конфликтов.

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

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

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

Для простоты мы будем рекурсивно визуализировать этот вложенный объект, который структурирован как ваш объект categories:

const categories = {
  level1: {
    "level1-1": {
      "level1-1-1": {
        "level1-1-1-1": {}
      }
    },
    "level1-2": {
      "level1-2-1": {}
    }
  },
  level2: {}
};

Условием окончания рекурсии будет объект без keys.

Для каждого слоя визуализируйте keys и сделайте шаг рекурсии.

const makeMenuLayer = layer => {
  const layerKeys = Object.entries(layer).map(([key, value]) => (
    <>
      {key}
      {makeMenuLayer(value)}
    </>
  ));
  return <div>{layerKeys}</div>;
};

Приведет к:

level1
level1-1
level1-1-1
level1-1-1-1
level1-2
level1-2-1
level2

Ознакомьтесь с примером песочницы.

Edit o49onn9n45

Большое спасибо Денис! Это действительно очень помогает.

Emily 10.05.2019 21:02

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