reactjs - Next.js:导航到新路线时更新导航栏组件
问题描述
目标:当页面导航到时更新导航栏重音
当前:导航栏重音有延迟更新。它更新到上次访问的页面。例如:如果我从第 1 页开始,然后单击第 2 页,则重音一直在第 1 页上,直到我再次单击第 2 页。如果我然后单击 page3,page2 现在将具有重音。
尝试:我正在使用next.router
inuseEffect
尝试更新router
.
代码:
app.js
import "tailwindcss/tailwind.css";
import Layout from "../components/Layout";
function MyApp({ Component, pageProps }) {
return (
<Layout>
<Component {...pageProps} />
</Layout>
);
}
export default MyApp;
layout.js
import Navbar from "./Navbar";
export default function Layout({ children }) {
return (
<div className="layout">
<Navbar />
<div className="">{children}</div>
</div>
);
}
navbar.js
import Link from "next/link";
import { useRouter } from "next/router";
import { useEffect } from "react";
function classNames(...classes) {
return classes.filter(Boolean).join(" ");
}
const navigation = [
{ name: "page1", href: "/", current: true },
{ name: "page2", href: "/page2", current: false },
{ name: "page3", href: "/page3", current: false },
];
export default function Navbar() {
const router = useRouter();
useEffect(
(e) => {
navigation.map((item) => {
if (router.route == item.href) {
item.current = true;
} else {
item.current = false;
}
});
console.log(router.route);
},
[router]
);
return (
<div>
<div>
{navigation.map((item) => (
<Link href={item.href} key={item.name}>
<a
className={classNames(
item.current
? "border-indigo-500 text-gray-900"
: "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700",
"inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium"
)}
aria-current={item.current ? "page" : undefined}
>
{item.name}
</a>
</Link>
))}
</div>
</div>
);
}
index.js
page2 & page3 是相似的。
export default function Home() {
return (
<div className="flex flex-col items-center justify-center min-h-screen py-2">
Hello
</div>
);
}
解决方案
放下useEffect
并继续
import Link from "next/link";
import { useRouter } from "next/router";
function classNames(...classes) {
return classes.filter(Boolean).join(" ");
}
const navigation = [
{ name: "page1", href: "/" },
{ name: "page2", href: "/page2" },
{ name: "page3", href: "/page3" },
];
export default function Navbar() {
const router = useRouter();
return (
<div>
<div>
{navigation.map((item) => (
<Link href={item.href} key={item.name}>
<a
className={classNames("inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium", router.route === item.href ? "border-indigo-500 text-gray-900" : "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700")}
aria-current={router.route === item.href ? "page" : undefined}
>
{item.name}
</a>
</Link>
))}
</div>
</div>
);
}
推荐阅读
- neo4j - 如果附加到具有特定值的节点集,则返回节点
- php - 将 PHP 值传递给 jquery
- android - 更改可见性后,Android 地图渲染会失真并在下方显示黑色
- powershell - 从文本文件中列出的多个文件中获取文件信息
- java - 单元测试 xml 反序列化期间的异常
- c++ - 具有两种不同结果的 Rand 函数
- pandas-groupby - 数据帧的条件分组
- unity3d - 如何在 Unity 编辑器中为 PrefixLabel 着色?
- javascript - 使用 Javascript 调用 SCSS mixin 文件
- android - 为什么 Flowable 不能订阅 Observer?