#reactjs #next.js
#reactjs #next.js
Вопрос:
я хочу добавить класс на панель, если у какого-либо из его дочерних элементов есть класс ‘acitve’. как добавить класс ‘parent-active’, если дочерний элемент получает класс ‘active’. спасибо за вашу помощь!
const MyComponent = ({
router,
className,
items
}) => {
return (
<Collapse accordion={true}>
{items.map(dropdown => {
return (
<Panel
header={dropdown.title}
headerClass="dropdown-title"
className={router.pathname === item.href ? 'parent-active' : ''}
key={dropdown.id}
>
{dropdown.dropdownItems.length}
{dropdown.dropdownItems.map(item => (
<Link href={item.href} key={item.id}>
<a
className={
router.pathname === item.href ? 'active' : ''
}
>
{item.label}
</a>
</Link>
))}
</Panel>
);
})}
</Collapse>
);
};
export default withRouter(MyComponent);
Комментарии:
1. Кристиан написал четкое решение, но просто чтобы вы знали, вы назвали переменную внутри вашего первого элемента метода map вместо выпадающего списка. Строка className={router.pathname === item.href? ‘parent-active’ : «} должно быть className={router.pathname === dropdown.href ? ‘parent-active’ : «}
Ответ №1:
Мы можем использовать Array.prototype.some()
, чтобы определить, будет ли у какого-либо из дочерних элементов active
класс:
const isAnyChildActive = dropdownItems.some((item) => router.pathname === item.href);
И полный фрагмент кода:
const MyComponent = ({
router,
className,
items
}) => {
return (
<Collapse accordion={true}>
{items.map(dropdown => {
const { dropdownItems } = dropdown;
const isAnyChildActive = dropdownItems.some((item) => router.pathname === item.href);
return (
<Panel
header={dropdown.title}
headerClass="dropdown-title"
className={isAnyChildActive ? 'parent-active' : ''}
key={dropdown.id}
>
{dropdown.dropdownItems.length}
{dropdown.dropdownItems.map(item => (
<Link href={item.href} key={item.id}>
<a
className={
router.pathname === item.href ? 'active' : ''
}
>
{item.label}
</a>
</Link>
))}
</Panel>
);
})}
</Collapse>
);
};
export default withRouter(MyComponent);