Активные вкладки HeadlessUI Tabs возвращаются к 0 после обновления

Мне очень нужна помощь по вкладкам безголового интерфейса пользователя. Я пытался исправить это самостоятельно и исследовал, но не хватало ресурсов по моей проблеме. Я до сих пор не понимаю, как это не работает, я тоже читал документы.

      import { useEffect, useState } from "react";
import { Tab } from "@headlessui/react";

function classNames(...classes) {
  return classes.filter(Boolean).join(" ");
}

export default function Tabs({ tabs }) {
  const [index, setIndex] = useState();

  return (
    <Tab.Group
      defaultIndex={index}
      onChange={(index) => {
        console.log("Changed selected tab to:", index);
        setIndex(index);
      }}
    >
      <Tab.List className="text-xl space-x-9">
        {tabs.map(({ tab }, index) => (
          <Tab
            key={index}
            className={({ selected }) =>
              classNames(
                selected ? "text-gray-900" : "text-gray-400 font-avenir-roman"
              )
            }
          >
            {tab}
          </Tab>
        ))}
      </Tab.List>
      <Tab.Panels>
        {tabs.map(({ content }, index) => (
          <Tab.Panel key={index}>{content}</Tab.Panel>
        ))}
      </Tab.Panels>
    </Tab.Group>
  );
}

2 ответа

Это то, что я сделал, чтобы сохранить currentTab

      const [currentTab, setCurrentTab] = useState(0);

useEffect(() => {
    localStorage.setItem("currentTab", JSON.stringify(currentTab));
  }, [currentTab]);

  useEffect(() => {
    const currentTab = JSON.parse(localStorage.getItem("currentTab"));
    if (currentTab) {
      setCurrentTab(currentTab);
    }
  }, []);

 <Tab.Group
            defaultIndex={tab}
            onChange={(currentTab) => {
              setCurrentTab(currentTab);
              router.replace(
                {
                  pathname: `/path/userPath/edit/${id}`,
                  query: { tab: currentTab },
                },
                undefined,
                {
                  shallow: true,
                }
              );
            }}
          >

Нашел простой способ сделать это, используя параметр запроса URL. Прежде всего добавьте параметр запроса, используя onClick для каждого компонента вкладки.

{BASEURL}?tab={tab_name}

Затем создайте функцию, подобную следующей:

      const router = useRouter();

const getActiveTab = () => {
    const tabValues = ["tab1","tab2"]; //This should contains the all the tab_names you given earlier when calling onClick.

    return tabValues.indexOf(router.query.tab);
  };

После этого установите атрибут defaultIndex компонента Tab.Group равным возвращаемому значению функции следующим образом:

      <Tab.Group defaultIndex={getActiveTab()}>
  <Tab.List>
  </Tab.List>
<Tab.Group/>
Другие вопросы по тегам