Ваша проблема в том, что ваше состояние обрабатывает только логическое значение (открыто или нет), но на самом деле вам нужно несколько логических значений (по одному "открыто или нет" для каждого элемента меню). Вы можете попробовать что-то вроде этого:
const [isOpen, setIsOpen] = useState({});
const handleDropdownClick = e => {
e.preventDefault();
const currentID = e.currentTarget.id;
const newIsOpenState = isOpen[id] = !isOpen[id];
setIsOpen(newIsOpenState);
};
И, наконец, в вашем HTML:
const linkname = links.map((item, index) => {
// Check to see if NavItem contains Dropdown Children
return item.items.length > 1 ? (
<Fragment>
<StyledNavBar.NavLink id={index} onClick={handleDropdownClick} href={item.primary.link.url}>
{item.primary.label[0].text}
</StyledNavBar.NavLink>
<Dropdown toggleOpen={isOpen[index]}>
// ... rest of your component
Обратите внимание на новую переменную index в функции .map
, которая используется для определения того, какой пункт меню вы щелкаете.
UPDATE:
Одним моментом, который я упустил, была инициализация, как упоминалось в другом ответе @MattYao. Внутри ваших данных нагрузки сделайте это:
data.then(res => {
const navlinks = res.results[0].data.nav;
setLinks(navlinks);
setIsOpen(navlinks.map((link, index) => {index: false}));
});
Не относится к вашему вопросу, но вы можете рассмотреть пропускающие эффекты , включая клавишу для вашего .map