Skip to content

Commit b2df2cf

Browse files
authored
chore(examples): Update active-class-name example (vercel#43581)
I updated the `active-class-name` example to stop using the legacy behavior. ## Documentation / Examples - [x] Make sure the linting passes by running `pnpm build && pnpm lint` - [x] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
1 parent 4ee933d commit b2df2cf

File tree

2 files changed

+25
-25
lines changed

2 files changed

+25
-25
lines changed

examples/active-class-name/components/ActiveLink.tsx

+12-17
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
import { useRouter } from 'next/router'
22
import Link, { LinkProps } from 'next/link'
3-
import React, { useState, useEffect, ReactElement, Children } from 'react'
3+
import React, { PropsWithChildren, useState, useEffect } from 'react'
44

55
type ActiveLinkProps = LinkProps & {
6-
children: ReactElement
6+
className?: string
77
activeClassName: string
88
}
99

1010
const ActiveLink = ({
1111
children,
1212
activeClassName,
13+
className,
1314
...props
14-
}: ActiveLinkProps) => {
15+
}: PropsWithChildren<ActiveLinkProps>) => {
1516
const { asPath, isReady } = useRouter()
16-
17-
const child = Children.only(children)
18-
const childClassName = child.props.className || ''
19-
const [className, setClassName] = useState(childClassName)
17+
const [computedClassName, setComputedClassName] = useState(className)
2018

2119
useEffect(() => {
2220
// Check if the router fields are updated client-side
@@ -33,29 +31,26 @@ const ActiveLink = ({
3331

3432
const newClassName =
3533
linkPathname === activePathname
36-
? `${childClassName} ${activeClassName}`.trim()
37-
: childClassName
34+
? `${className} ${activeClassName}`.trim()
35+
: className
3836

39-
if (newClassName !== className) {
40-
setClassName(newClassName)
37+
if (newClassName !== computedClassName) {
38+
setComputedClassName(newClassName)
4139
}
4240
}
4341
}, [
4442
asPath,
4543
isReady,
4644
props.as,
4745
props.href,
48-
childClassName,
4946
activeClassName,
50-
setClassName,
5147
className,
48+
computedClassName,
5249
])
5350

5451
return (
55-
<Link {...props} legacyBehavior>
56-
{React.cloneElement(child, {
57-
className: className || null,
58-
})}
52+
<Link className={computedClassName} {...props}>
53+
{children}
5954
</Link>
6055
)
6156
}

examples/active-class-name/components/Nav.tsx

+13-8
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,28 @@ const Nav = () => (
1313
`}</style>
1414
<ul className="nav">
1515
<li>
16-
<ActiveLink activeClassName="active" href="/">
17-
<a className="nav-link">Home</a>
16+
<ActiveLink activeClassName="active" className="nav-link" href="/">
17+
Home
1818
</ActiveLink>
1919
</li>
2020
<li>
21-
<ActiveLink activeClassName="active" href="/about">
22-
<a className="nav-link">About</a>
21+
<ActiveLink activeClassName="active" className="nav-link" href="/about">
22+
About
2323
</ActiveLink>
2424
</li>
2525
<li>
26-
<ActiveLink activeClassName="active" href="/blog">
27-
<a className="nav-link">Blog</a>
26+
<ActiveLink activeClassName="active" className="nav-link" href="/blog">
27+
Blog
2828
</ActiveLink>
2929
</li>
3030
<li>
31-
<ActiveLink activeClassName="active" href="/[slug]" as="/dynamic-route">
32-
<a className="nav-link">Dynamic Route</a>
31+
<ActiveLink
32+
activeClassName="active"
33+
className="nav-link"
34+
href="/[slug]"
35+
as="/dynamic-route"
36+
>
37+
Dynamic Route
3338
</ActiveLink>
3439
</li>
3540
</ul>

0 commit comments

Comments
 (0)