【问题标题】:My state open all of my submenu but i just want one submenu open我的状态打开了我所有的子菜单,但我只想打开一个子菜单
【发布时间】:2020-05-15 13:24:51
【问题描述】:

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

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

我知道我的方法不对,但我不知道该怎么做:(

我的示例代码:

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”按钮来查看femme的子类别时,就像我也点击了“Enfant”按钮一样。

我可以创建一个合成器并在里面创建 usestate "const [visibleSubCategorie, setVisibleSubCategorie] = useState(false)" 并且这个合成器在地图中,但我知道存在另一种方法。

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

您正在使用相同的状态来控制所有子类别。一个可能的解决方案是将 useState 作为每个子类别的字符串值数组。

const [visibleSubCategorie, setVisibleSubCategorie] = useState([])

setVisibleSubCategorie([...visibleSubCategorie, subCategorys.name])

然后检查该名称是否存在于数组中,以了解是否应该显示子类别。

{visibleSubCategorie.includes(subCategorys.name) && item.subCategory.map(subCategorys=>

然后,您必须在关闭时从数组中删除该项目。

【讨论】:

    【解决方案2】:

    您可以使用类似于@Kyler 建议的方法解决此问题。

    我建议使用 HOC,如下所示:

    const setOpen = (setOpen, opened) => () => setOpen(!opened);
    

    然后在你的 JSX 中:

    onClick={setOpen(setVisibleSubCategorie, visibleSubCategorie)}
    

    请注意,为了使其正常工作,您必须为每个部分设置状态。

    【讨论】:

    • 您是否为每个菜单创建了一个状态?
    猜你喜欢
    • 2017-08-08
    • 2022-07-20
    • 2014-02-08
    • 2015-09-09
    • 2012-01-15
    • 2013-09-27
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多