提问人:Kulbhushan Sharma 提问时间:8/2/2022 最后编辑:Kulbhushan Sharma 更新时间:8/4/2022 访问量:856
如何创建带有片段标识符(哈希链接)的 react 选项卡导航栏链接?
How to create react tab navbar links with fragment identifiers (hash links)?
问:
我创建了一个带有一些选项卡的页面。选项卡代码如下:
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”路线。
答:
1赞
Drew Reese
8/3/2022
#1
react-router-hash-link
AFAIK 尚未更新为与 兼容。也就是说,您似乎没有将哈希值用于正常目的。可以从对象中读取 URL 值并进行分析以提取数字选项卡值。使用钩子“侦听”对 的更改以更新本地状态。react-router-dom@6
hash
location
useEffect
hash
toggleState
例:
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>
就像我说的,这是对 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>
评论
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);
上一个:需要循环来简化组件
评论