我有一个左菜单,当您单击某个元素时,该元素的子菜单就会出现。
但是使用我的实际代码,当单击一个元素时,我的所有子菜单都会出现。
我知道我的方法不正确,但是我不知道该怎么做:(
我的示例代码:
import { useState } from 'react'
export default function Menu(){
const [visibleSubCategorie, setVisibleSubCategorie] = useState(false)
const Menu = [{
name: 'Homme', link : '/homme-fr', subCategory: false
}, {
name: 'Femme', link : '/femme-fr', subCategory: [{
name: 'haut', link : '/femme-haut-fr'
},{
name: 'bas', link : '/femme-bas-fr'
}]
},{
name: 'Enfant', link : '/enfant-fr', subCategory: [{
name: 'haut', link : '/enfant-haut-fr'
},{
name: 'bas', link : '/enfant-bas-fr'
}]
}]
console.log("Menu -> Menu", Menu)
return(
<>
{Menu.map(item=>
<div>
{item.subCategory ?
<>
<button type="button" onClick={() => setVisibleSubCategorie(!visibleSubCategorie)}>{item.name}</button>
{visibleSubCategorie && item.subCategory.map(subCategorys=>
<>
<p>{subCategorys.name}</p>
</>
)}
</>
:
<a href={item.link}>{item.name}</a>
}
</div>
)}
</>
)
}``
示例:当我单击“ Femme”按钮以查看女性的子类别时,就像我也单击“ Enfant”按钮一样。
我可以创建一个合成器,并在地图的内部创建usestate“ const [visibleSubCategorie,setVisibleSubCategorie] = useState(false)”,但是我知道存在另一种方法。
答案 0 :(得分:0)
您正在使用同一状态来控制所有子类别。一种可能的解决方案是将useState用作每个子类别的字符串值数组。
const [visibleSubCategorie, setVisibleSubCategorie] = useState([])
setVisibleSubCategorie([...visibleSubCategorie, subCategorys.name])
然后检查该名称是否存在于数组中,以了解是否应显示子类别。
{visibleSubCategorie.includes(subCategorys.name) && item.subCategory.map(subCategorys=>
然后,您必须在关闭时从数组中删除该项目。
答案 1 :(得分:0)
您可以使用类似于@Kyler建议的方法来解决此问题。
我建议使用HOC,如下所示:
const setOpen = (setOpen, opened) => () => setOpen(!opened);
然后在您的JSX中:
onClick={setOpen(setVisibleSubCategorie, visibleSubCategorie)}
请注意,要使其正常工作,您必须对每个部分都具有状态。