javascript - 使用 API json 对象设置动态菜单?
问题描述
我不确定我能做些什么来完成这项工作......所以我正在调用 API 数据(这只是一堆嵌套的 json 对象)来创建一个菜单。到目前为止,我已经让它能够渲染第一层对象(第一个 img),当您单击每个元素时,下一层会显示在它下方(第二个 img)。这是递归的,所以当我单击“级别 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.log(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);
}
}
解决方案
如果可能的话,你应该尽量避免通过使用 vanilla JS 创建/附加元素来操作 DOM,同时使用 React,它的主要优势之一是虚拟 DOM,它可以为你管理渲染并避免冲突。
不确定您要渲染的对象有多深,但由于数据的复杂性,这将是使用另一个组件来模块化事物并避免您现在处理的混乱的好案例。
假设所有子对象的结构都相同,您可以创建一个基于对象键递归呈现自身的组件。 这个答案应该会有所帮助。
推荐阅读
- javascript - 当我重新加载我的网站时,它会将我发送到不同的部分,然后我在重新加载之前
- java - Spring拦截器重定向不起作用
- java - 奇怪的行为 Maven 测试
- mysql - 我如何将类型 bit(1) 从 csv 导入 mysql 表
- bash - 需要帮助构建使用 Bash 脚本修改子文件夹中文件的逻辑
- c# - 当我在上面放一个物体时,我的绳子会无限伸展
- laravel-5 - 我该如何解决这个错误?,快速使用
- symfony - 将树枝渲染为 html 文件,避免重复代码添加变量
- android - 具有无效 manageSpaceActivity 值的 AndroidManifest 会禁用“清除数据”按钮。这是合法的还是无意的行为?
- c# - 为什么在 DataGrid 中刷新 ObservableCollection 很慢