用react实现一个二级菜单 应该是怎样的结构
const nav = [
{
name: "菜单1",
children: [
{
child: "子菜单1"
},
{
child: "子菜单2"
},
]
},
{
name: "菜单2",
children: [
{
child: "子菜单3"
},
{
child: "子菜单4"
},
]
}
]
constructor(props) {
super(props)
this.state = {
isShow: false
}
}
render() {
return (
<ul>
{
nav && nav.map(e => {
return (
<li onClick={() => this.setState({isShow: true})}>
<a>{e.name}</a>
{
isShow && <div>
{
e.children && e.children.map(k => {
return (
<span>{k.child}</span>
)
})
}
</div>
}
</li>
)
})
}
</ul>
)
}
3 回答1.9k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
4 回答1.6k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
很快的写了一个示例代码,但可能不是最好的作法,css网上随手抓的,组件名也是临时取的不精准,只是提供一个思路。其实有很多已经写好的漂亮菜单组件可直接用,或是直接用纯CSS菜单作法会比较简单,自己写大概纯研究用。
用两个state中的值来控制第一级与第二级菜单项被选中的状态,简单地用数组索引代表被选中的菜单项,-1代表目前没有任何菜单项被选中。选中用MouseOver事件,没选中用MouseLeave事件。第一级菜单项直接用索引值切换选中,第二级用事件获取data-id与第一级菜单的索引值合并来setState这样。
代码演示长这样:
index.html,主要里面有菜单的css,网上这里复制来用的:
App.js,主组件,集成第一级菜单,所有事件触发方法都在里面:
MenuLevel.js,第一级菜单项目用的:
SubMenuItem.js,第二级菜单项目用的:
注:
e.target.attributes.getNamedItem('data-id').value
可改为e.target.getAttribute('data-id')
或e.target.dataset.id