Я пытаюсь установить активный класс для дочернего компонента B при отключении активного класса для дочернего компонента A, когда я нажимаю на B.
До сих пор я пробовал использовать хуки в родительском классе, где я отключил активную опору для всех дочерних элементов, используя 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';
};
и в заявлении возврата:
{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>
Редактировать:
После использования решения от Ори Дрори активный класс был установлен на нажатой ссылке NavLink и удален из остальных. Поскольку я хотел, чтобы onClick был функцией навигации, все, что я изменил, - это установка onClick в родительском элементе для навигации и вызова функции навигации 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>
);
}