如何创建带有片段标识符(哈希链接)的 react 选项卡导航栏链接?

How to create react tab navbar links with fragment identifiers (hash links)?

提问人:Kulbhushan Sharma 提问时间:8/2/2022 最后编辑:Kulbhushan Sharma 更新时间:8/4/2022 访问量:856

问:

我创建了一个带有一些选项卡的页面。选项卡代码如下:

const [ toggleState, setToggleState ] = useState(1);

const toggleTab = (index) => {
 setToggleState(index);
}

<div className="tab-title-Container">
 <li className= {toggleState === 1 ? "tab-name active-name" : "tab-name"} 
  onClick={() => toggleTab(1)}>Tab1</li>
 <li className= {toggleState === 2 ? "tab-name active-name" : "tab-name"} 
  onClick={() => toggleTab(2)}>Tab2</li>
</div>
<div className="tab-content-Container">
 <div className= {toggleState === 1 ? "tab-content active-content" : "tab-content"}>
  Tab1 Content</div>
 <div className= {toggleState === 2 ? "tab-content active-content" : "tab-content"}>
  Tab2 Content</div>
</div>

style:
.tab-content {display: none;}
.active-content {display: block;}

现在我想创建每个选项卡的导航栏链接。当我单击 Tab2 导航栏链接时,此页面应打开,并且 Tab2 切换到活动类(默认活动选项卡为 Tab1)。我正在使用 react-router-dom“: ”^6.3.0”。

我需要为他们创建这样的“https://example.com/page=01#tab1”、“https://example.com/page=01#tab2”路线。

reactjs tabnavigator react-tabs react-router-hash-link

评论


答:

1赞 Drew Reese 8/3/2022 #1

react-router-hash-linkAFAIK 尚未更新为与 兼容。也就是说,您似乎没有将哈希值用于正常目的。可以从对象中读取 URL 值并进行分析以提取数字选项卡值。使用钩子“侦听”对 的更改以更新本地状态。react-router-dom@6hashlocationuseEffecthashtoggleState

例:

import { useEffect, useState } from "react";
import { useLocation } from "react-router-dom";

const Page = () => {
  const { hash } = useLocation();

  const [toggleState, setToggleState] = useState(1);

  useEffect(() => {
    setToggleState(Number(hash.slice(4))); // hash is "#tabX" so strip first 4 chars
  }, [hash]);

  const toggleTab = (index) => {
    setToggleState(index);
  };

  return (
    ...
  );
};

...

<Link to="/1#tab1">Page 1 tab 1</Link>
<Link to="/1#tab2">Page 1 tab 2</Link>
<Link to="/2#tab1">Page 2 tab 1</Link>
<Link to="/2#tab2">Page 2 tab 2</Link>

Edit how-to-create-react-tab-navbar-links-with-fragment-identifiers-hash-links

就像我说的,这是对 URL 哈希的有点奇怪。我认为查询参数将是一个改进的替代方案。

例:

import { useEffect, useState } from "react";
import { useSearchParams } from "react-router-dom";

const Page = () => {
  const [searchParams, setSearchParams] = useSearchParams();
  const { pageId } = useParams();

  const [toggleState, setToggleState] = useState(1);

  useEffect(() => {
    // access tab query parameter
    const tab = searchParams.get("tab");
    if (tab) {
      // synchronize local state
      setToggleState(Number(tab));
    } else {
      // redirect to correct tab
      searchParams.set("tab", 1);
      setSearchParams(searchParams, { replace: true });
    }
  }, [searchParams, setSearchParams]);

  const toggleTab = (index) => {
    setToggleState(index);
  };

  return (
    ...
  );
};

...

<Link to="/1?tab=1">Page 1 tab 1</Link>
<Link to="/1?tab=2">Page 1 tab 2</Link>
<Link to="/2?tab=1">Page 2 tab 1</Link>
<Link to="/2?tab=2">Page 2 tab 2</Link>

Edit how-to-create-react-tab-navbar-links-with-fragment-identifiers-hash-links (forked)

评论

1赞 Kulbhushan Sharma 8/3/2022
我尝试了带有查询参数的第二个解决方案,经过一些自定义后,它完全按照预期运行。
0赞 Kulbhushan Sharma 8/3/2022
现在注意到一个问题:如果我使用 <Link to=“/1”>Page 1</Link>直接访问 Page1,则所有选项卡都显示处于非活动状态。默认情况下,Tab1 应在访问页面时显示。请解决此问题
0赞 Drew Reese 8/4/2022
@KulbhushanSharma 当然,手动重定向到“默认”选项卡是微不足道的。我已经更新了我的答案并链接了沙盒。如果可以的话,请看一看。
0赞 Kulbhushan Sharma 8/4/2022
感谢您的宝贵努力。现在它起作用了。只有当我们使用 <Link to=“/1”>Page 1</Link>时,才保留我们的 url “www.myweb.com/1”而不是“www.myweb.com/1?tab=1”吗?
0赞 Drew Reese 8/4/2022
@KulbhushanSharma 绝对有。我认为您可以直接调用 else 分支,而不是更新查询搜索参数。setToggleState(1);