reactjs - 单击 React.js 中的另一个切换按钮时如何删除活动类?
问题描述
在 React.js 中,我有页面链接菜单和 3 个切换按钮header.js
。
单击时,所有切换按钮都有div
层。
我想做的是……
- 单击切换按钮时,必须删除其他切换按钮和图层
active
- 单击页面链接菜单(menu1,menu2,menu3)时,必须删除所有切换按钮和图层
active
我需要更改代码吗?
这是我到目前为止所尝试的。
请帮忙。
演示:https ://codesandbox.io/s/49io4
header.js
import React, { useState, useEffect } from "react";
import { NavLink } from "react-router-dom";
export default function Header() {
const [show, setShow] = useState(false);
const [show2, setShow2] = useState(false);
const [show3, setShow3] = useState(false);
useEffect(() => {
if (show) {
document.body.classList.add("bodyRemoveScroll");
} else {
document.body.classList.remove("bodyRemoveScroll");
}
}, [show]);
const onToggleClick = () => setShow(!show);
const onToggleClick2 = () => setShow2(!show2);
const onToggleClick3 = () => setShow3(!show3);
return (
<div className="header">
{/* <NavLink to="/">Home</NavLink> */}
/<NavLink to="/menu1">menu1</NavLink>/
<NavLink to="/menu2">menu2</NavLink>/<NavLink to="/menu3">menu3</NavLink>/
<button onClick={onToggleClick} className={show ? "active" : ""}>
toggle1
</button>
<nav className={`layer1 ${show ? "active" : ""}`}>layer 1</nav>/
<button onClick={onToggleClick2} className={show2 ? "active" : ""}>
toggle2
</button>
<nav className={`layer2 ${show2 ? "active" : ""}`}>layer 2</nav>/
<button onClick={onToggleClick3} className={show3 ? "active" : ""}>
toggle3
</button>
<nav className={`layer3 ${show3 ? "active" : ""}`}>layer 3</nav>
</div>
);
}
解决方案
在您的示例中,您应该在单击某个项目后取消选择其他值。其他(首选)选项是拥有 1 个状态变量,您将在其中存储当前活动的按钮 ID
const onToggleClick = () => {
setShow(!show)
setShow2(false);
setShow3(false);
};
const onToggleClick2 = () => {
setShow(false)
setShow2(!show2);
setShow3(false);
};
const onToggleClick3 = () => {
setShow(false)
setShow2(false);
setShow3(!show3);
};
所以下面的例子对我来说看起来更漂亮
import React, { useState, useEffect } from "react";
import { NavLink } from "react-router-dom";
export default function Header() {
const [active, setActive] = useState('');
useEffect(() => {
if (active) {
document.body.classList.add("bodyRemoveScroll");
} else {
document.body.classList.remove("bodyRemoveScroll");
}
}, [active]);
const onSetActiveMenuItem = (item) => {
if (item !== active){
setActive(item);
}
else {
setActive(''); // handle click on currently active item
}
};
return (
<div className="header">
{/* <NavLink to="/">Home</NavLink> */}/
<NavLink to="/menu1">menu1</NavLink>/<NavLink to="/menu2">menu2</NavLink>/
<NavLink to="/menu3">menu3</NavLink>/
<button onClick={() => onSetActiveMenuItem('item1')} className={active === 'item1' ? "active" : ""}>
toggle1
</button>
<nav className={`layer1 ${active === 'item1' ? "active" : ""}`}>layer 1</nav>/
<button onClick={() => onSetActiveMenuItem('item2')} className={active === 'item2' ? "active" : ""}>
toggle2
</button>
<nav className={`layer2 ${active === 'item2' ? "active" : ""}`}>layer 2</nav>/
<button onClick={() => onSetActiveMenuItem('item3')} className={active === 'item3' ? "active" : ""}>
toggle3
</button>
<nav className={`layer3 ${active === 'item3' ? "active" : ""}`}>layer 3</nav>
</div>
);
}
推荐阅读
- python - Pandas - 如何使用 pandas / numpy 在数据框 / 列中求和时间
- python - 使用 python 为 Cloud Storage 中的对象生成签名 URL
- javascript - 在对象中使用函数的参数 - Vue.js
- laravel - Laravel Livewire:在更新之间保持隐藏/显示组件的状态
- python - 如何从烧瓶会话字典中删除密钥?
- flutter - 无法根据另一个 StreamSubscription 的条件取消我的 StreamSubscription?
- reactjs - 如何在打字稿中为 thunk 提供对象
- postgresql - PostgreSQL 错误使用 pgAdmin4 上传 csv 文件
- php - 在 PHP laravel 中配置 aws SDK
- html - 在 CSS 中尝试可滚动的下拉菜单