reactjs - onClick 触发所有子菜单,而不仅仅是被点击的菜单
问题描述
当我点击一个项目时,它应该消耗一些子项目。这是可行的,但是如果我有两个、三个或四个等列表项,那么当我单击一个时,它会展开所有列表项的所有子项,这显然不是我想要的。如何修复此代码以使其仅打开扩展我实际单击的代码?
const [sideActive, setSideActive] = useState(false);
const toggleSideActive = () => {
setSideActive(!sideActive);
};
html:
<li>
<div
onClick={toggleSideActive}
className={
sideActive
? `${styles.navList__subheading} row ${styles.row__align_v_center} ${styles.navList__subheading__open}`
: `${styles.navList__subheading} row ${styles.row__align_v_center}`
}
>
<span className={styles.navList__subheading_icon}>
<FaBriefcaseMedical />
</span>
<span className={styles.navList__subheading_title}>
insurance
</span>
</div>
<ul
className={
sideActive
? `${styles.subList}`
: `${styles.subList} ${styles.subList__hidden}`
}
>
<li className={styles.subList__item}>medical</li>
<li className={styles.subList__item}>medical</li>
<li className={styles.subList__item}>medical</li>
</ul>
</li>
解决方案
您可以创建一个本地状态来跟踪选定的 id 并根据状态显示内容。此外,在单击选项卡时更新选定的 ID,如下所示。
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [selected, setSelected] = useState("");
const data = [
{
id: 1001,
name: "Tab - 1",
content: ["test1", "test2"]
},
{
id: 1002,
name: "Tab - 2",
content: ["test21", "test22"]
}
];
return (
<div className="App">
<ul class="parent">
{data.map((v) => (
<li onClick={() => setSelected(selected !== v.id ? v.id : "")}>
{v.name}
{selected === v.id && (
<ul class="content">
{v.content.map((val) => (
<li>{val}</li>
))}
</ul>
)}
</li>
))}
</ul>
</div>
);
}
对于以下示例,单击选项卡以查看内容。
工作代码 - https://codesandbox.io/s/long-leaf-cl4cy?file=/src/App.js:0-759
如果您遇到任何问题,请告诉我。
推荐阅读
- java - Java反射:构造函数参数顺序是否有保证
- if-statement - VHDL 进程中的多个非嵌套 if 语句是一种不好的做法吗?
- python - SQLAlchemy 通过 JSON 子字段加入
- git - 如何修复错误致命:无法访问'.git/config':权限被拒绝
- c# - 使用asp net core的xml filr中的动态连接字符串
- c# - C# 生成 Excel,公式显示为静态文本
- python - 如何将 3 个 AMLsim 示例数据集合并到 1 个 csv 文件,以便可以训练 ML 模型?
- ios - 添加 firebase crashlytics pod 时,xcode9.4 上的 GoogleDataTransport 类出现错误
- laravel - PHPUnit:动态加载不同的环境文件
- flutter - 如何从共享首选项将初始值设置为 texfeild