Я не уверен, что я мог бы сделать, чтобы эта работа работала... Поэтому я вызываю данные 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);
}
}
вот скриншот "категорий" в консоли (объекты внутри объектов внутри объектов)

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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны стараться избегать манипулирования 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
Ознакомьтесь с примером песочницы.
Большое спасибо Денис! Это действительно очень помогает.
покажите нам, как выглядят категории, вы должны визуализировать все с самого начала