I'm using the experimental appDir in Next.js 13, where they have replaced next/router with next/navigation, so I imported the useRouter hook accordingly. I do not see the property pathname in the router, which does exist in next/router's router.
Property 'pathname' does not exist on type 'AppRouterInstance'
My use case is to highlight the link in my navbar that the user is currently on. This is what I tried:
import Link from "next/link";
import { useRouter } from 'next/navigation';
const StyledNavLink: React.FC<NavLinkProps> = ({ to, children }) => {
const router = useRouter();
...
return (
<Link href={to} className={getNavLinkClass({isActive: router.pathname === to})}>
{children}
</Link>
);
};
Is there anything I can do to get the current path name or something else to add my classes on the active link?
CodePudding user response:
The pathname in Next 13 has its hook called usePathname(). They say in useRouter()'s new documentation:
The
pathnamestring has been removed and is replaced byusePathname().
That has been said, both usePathname() and useRouter() only work in a client component, which should have a "use client" string at the top:
The
usePathnamehook allows you to read the current URL pathname from a Client Component.
'use client';
import { usePathname } from 'next/navigation';
export default function Page() {
const pathname = usePathname();
return <div>{pathname}</div>;
}
