Как передать ключ элемента в вложенный массив при onMouseEnter?

codesandbox

Здравствуйте, изучаю js + react и собственно такая проблема... Хотел сделать dropdown-menu из объекта (типо mockdata) и не могу понять, как правильно отобразить список links по key родительского элемента.

{randomLinks.Navigate.map((nav_links, index) => {
  const keys = index;
  console.log(keys);
  return (
    <>
      <NavigateLink
        key={keys}
        data={nav_links.category}
        hoverMenu={hoverMenu}
        onMouseEnter={handeChangeState}
        onMouseLeave={handleChangeStateOver}
      />
      {hoverMenu && (
        <div
          key={index}
          className={`w-full mt-0 shadow-lg bg-white absolute`}
          onMouseLeave={() => setHoverMenu(false)}
          onMouseOver={() => setHoverMenu(true)}
        >
          {randomLinks.Navigate[keys].links.map((i) => {
            return <NavigatePopup key={index} data={i} />;
          })}
        </div>
      )}
    </>
  );
})}

т.е я навожу на элемент parent и он в свою очередь выдает мне key, который будет использоваться во вложенном child. Тем самым я получу элементы массивов, а сейчас у меня просто все подряд дропается...

На данный момент просто себя запутал...


Ответы (1 шт):

Автор решения: SwaD

Если я вас правильно понял, то вам надо изменить условия отображения дочерних элементов.

Для этого надо создать переменную состояния, в которую будем записывать индекс элемента, на который мышка наведена и удалять тогда, когда мышка будет убрана.

Условие отображения меняем с hoverMenu && на howId === index &&

const [howId, setHowId] = useState(null); // Хранит Index элемента

{randomLinks.Navigate.map((nav_links, index) => {
  const keys = index;
  console.log(keys);
  return (
    <>
      <NavigateLink
        key={keys}
        data={nav_links.category}
        hoverMenu={hoverMenu}
        onMouseEnter={(e) => {
          handeChangeState(e);
          setHowId(index); // При наведении записываем значение
        }}
        onMouseLeave={(e) => {
          handleChangeStateOver(e);
          setHowId(null); // Зануляем значение
        }}
      />

      {howId === index && (
        <div
          key={index}
          className={`w-full mt-0 shadow-lg bg-white absolute`}
          onMouseLeave={() => setHoverMenu(false)}
          onMouseOver={() => setHoverMenu(true)}
        >
          {randomLinks.Navigate[keys].links.map((i) => {
            return <NavigatePopup key={index} data={i} />;
          })}
        </div>
      )}
    </>
  );
})}
→ Ссылка