【发布时间】:2019-05-02 15:06:02
【问题描述】:
我试图在子组件 B 上设置一个活动类,同时在我单击 B 时禁用子组件 A 上的活动类。
到目前为止,我已经尝试在父类中使用钩子,通过使用setActive(''); 取消设置所有子类的活动道具,然后使用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';
};
在return语句中:
{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>
);
}
【问题讨论】:
标签: reactjs parent-child react-hooks setstate