reactjs - 如何在每个子组件上取消设置活动类,同时为单击的子组件设置为活动类
问题描述
我试图在子组件 B 上设置一个活动类,同时在我单击 B 时禁用子组件 A 上的活动类。
到目前为止,我已经尝试在父类中使用钩子,在其中我通过 using 取消设置所有子类的活动道具,setActive('');
然后将当前目标的类设置为 link--通过 using 激活e.currentTarget.className === 'link--active' ? e.currentTarget.className = '' : e.currentTarget.className = 'link--active';
。可悲的是,此时它所做的只是在点击的孩子上添加类或删除类。
家长:
const [active, setActive] = useState('');
const navigate = (e) => {
setActive('');
e.currentTarget.className === 'link--active' ? e.currentTarget.className = '' : e.currentTarget.className = 'link--active';
};
并在返回语句中:
{menuItems.map((item, index) => (
<li key={index} >
<NavLink target={item} onClick={(e) => navigate(e)} active={active} />
</li>
))}
孩子们:
<a href="#"
onClick={props.onClick}
className={props.active}>
{props.target}
</a>
编辑:
使用 Ori Drori 的解决方案后,在单击的 NavLink 上设置了活动类并从其余部分中删除。由于我希望 onClick 成为导航功能,因此我所做的只是将父级中的 onClick 设置为导航,并通过使用 id 作为参数来调用 setActive 并在导航函数中以 id 作为参数再次调用 setActive。这些类现在看起来像这样:
家长:
const [active, setActive] = useState(null);
const navigate = (id) => {
setActive(id);
};
return (
{menuItems.map((item) => (
<li key={item.id} >
<NavLink
{...item}
isActive={active === item.id}
onClick={navigate} />
</li>
))}
)
孩子:
const NavLink = ({id, target, isActive, onClick}) => {
return (
<a href="#"
onClick={useCallback(() => onClick(id), [id, onClick])}
className={isActive ? 'active' : ''}>
{target}
</a>
);
}
解决方案
传递setActive
给 NavLinks。单击a 时NavLink
,它设置为id
via setActive
。每个项目还接收isActive
属性,即状态true
是否active
与其匹配id
。
const { useCallback, useState } = React
const NavLink = ({ id, target, isActive, onClick }) => (
<a href="#"
onClick={useCallback(() => onClick(id), [id])}
className={`navLink ${isActive ? 'active' : ''}` }>
{target}
</a>
)
const Parent = ({ menuItems }) => {
const [active, setActive] = useState(null);
return (
<ul>
{menuItems.map((item) => (
<li key={item.id} >
<NavLink
{...item}
onClick={setActive}
isActive={active === item.id} />
</li>
))}
</ul>
)
}
const items = [{ id: 0, target: 'Ready' }, { id: 1, target: 'Player' }, { id: 2, target: 'One' }]
ReactDOM.render(
<Parent menuItems={items} />,
demo
)
.navLink {
color: blue;
text-decoration: none;
}
.active {
color: red;
}
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="demo"></div>
推荐阅读
- sql-server - 从 SQL Server 在屏幕上显示几行
- scala - 如何通过本地套接字而不是 scala/java 中的 inet 创建 GRPC 服务
- android - navigator.geolocation.getCurrentPosition 在 React Native 中不起作用
- android - Android 8:当铃声模式静音时,无法将铃声模式更改为非静音
- java - OpenJFX 对 32 位系统的支持
- opc - 西门子 Sinumerik Cnc 是否提供 Opc 服务器?
- sql - Vertica SQL 用于按列获取数据
- html - HTML - 点击后如何隐藏超链接?
- c# - ef core trouble with creating schemas
- xamarin.forms - 在代码中设置导航栏标题和图标