我的状态打开了我的所有子菜单,但我只想打开一个子菜单

时间:2020-05-15 13:24:51

标签: javascript reactjs

我有一个左菜单,当您单击某个元素时,该元素的子菜单就会出现。

但是使用我的实际代码,当单击一个元素时,我的所有子菜单都会出现。

我知道我的方法不正确,但是我不知道该怎么做:(

我的示例代码:

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)”,但是我知道存在另一种方法。

2 个答案:

答案 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)}

请注意,要使其正常工作,您必须对每个部分都具有状态。