๐Ÿชด Next.js

[Next.js/NextUI] ์—๋Ÿฌ ํ•ด๊ฒฐ : Next UI์˜ Tabs (ํƒญ) ๋ˆŒ๋Ÿฌ ํŽ˜์ด์ง€ ์ด๋™์‹œํ‚ค๊ธฐ + Tab์•ˆ์— Tab (์ด์ค‘ํƒญ) ๋ฌธ์ œํ•ด๊ฒฐ์ค‘

๋ จ๋”” 2024. 4. 2. 03:40
SMALL

4.1

 

์ฒ˜์Œ์œผ๋กœ Next UI๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค

์ฐธ๊ณ ๋กœ Next UI๋ฅผ ์ฒ˜์Œ ์…‹ํŒ…ํ•  ๋•Œ๋ถ€ํ„ฐ ์•ฝ๊ฐ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๊ณต์‹๋ฌธ์„œ์—์„œ ๋นผ๋จน์€ ๋ถ€๋ถ„๋•Œ๋ฌธ์ด์—ˆ๋‹ค ใ… ใ… 

Tailwind.config.js ์—์„œ 

const { nextui } = require("@nextui-org/react");

 

์ด ํ•œ ์ค„์„ ๋นผ๋จน์–ด์„œ ์ ์šฉ ์•ˆ๋๋˜ ๊ฒƒ..! ใ…Žใ…Ž ๊ณต์‹๋ฌธ์„œ๋Š” ์—ญ์‹œ ๊ผผ๊ผผํžˆ ๋ด์•ผํ•œ๋‹ค.

 


์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ ํ•ด๊ฒฐ

1) ์ƒํ™ฉ

(next js - app router ์‚ฌ์šฉ ์ค‘)

๊ทธ๋ฆฌ๊ณ  Next UI ๋ฅผ ํ†ตํ•ด Tabs ๋ฅผ ๋ชจ๋“  ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ์—์„œ ํ—ค๋”๋กœ์„œ ์ ์šฉ์‹œ์ผœ๋ณด๋ ค๊ณ  ํ–ˆ๋‹ค

https://nextui.org/docs/components/tabs

 

Tabs

Tabs organize content into multiple sections and allow users to navigate between them.

nextui.org

์ด๊ฑด ๊ทธ๋Œ€๋กœ ๋ณต๋ถ™ํ•˜๋ฉด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ด์ œ tab์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚ค๊ณ  ์‹ถ์—ˆ๋˜ ์ƒํ™ฉ!

href๋ฅผ ์จ์ฃผ๋ฉด ํŽ˜์ด์ง€ ์ด๋™์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํƒญ ์Šฌ๋ผ์ด๋”ฉ์ด ๋˜์ง€์•Š๊ณ  ์ƒˆ๋กœ๊ณ ์นจ์ด ๋˜๋ฉด์„œ ํ•ด๋‹น ํŽ˜์ด์ง€ ํƒญ ์„ ํƒ์ด ์œ ์ง€๋˜์ง€์•Š๊ณ  ๊ทธ๋ƒฅ ๋‹จ์ˆœํžˆ ๋ง๊ทธ๋Œ€๋กœ ํŽ˜์ด์ง€ ์ด๋™๋งŒ ๋  ๋ฟ ... ๐Ÿ˜‚

(=> ์ƒˆ๋กœ๊ณ ์นจ์œผ๋กœ tab ์ด ์ดˆ๊ธฐํ™”๋˜๋Š”๊ฒŒ ์•„๋‹Œ, ํ˜„์žฌ ํŽ˜์ด์ง€์™€ ํ•ด๋‹น tab์„ ์ผ์น˜์‹œํ‚ค๋ฉด์„œ ํƒญ์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์›€์ง์—ฌ์•ผํ–ˆ์Œ)

 

2. ๋ฌธ์ œ

๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณต์‹๋ฌธ์„œ๋Œ€๋กœ Links - Next.js ์ ์šฉ ๋ฐฉ๋ฒ•์„ ์ฐธ๊ณ ํ•ด ๊ทธ๋Œ€๋กœ ํ•ด๋ณด์•˜์ง€๋งŒ ๋˜์ง€ ์•Š์•˜๋‹ค.

 

๋‹น์—ฐํžˆ ์œ„ ๋‚ด์šฉ๋Œ€๋กœ ์•„๋ž˜์˜ routing ๊ฐ€์ด๋“œ๋„ ์ฐธ๊ณ ํ•ด์„œ ์…‹ํŒ…์„ ํ•ด๋‘์—ˆ์ง€๋งŒ ๋˜์ง€์•Š์•˜๋‹ค ใ… _ใ… 

https://nextui.org/docs/guide/routing

 

Routing

Learn how to integrate client side routing into your NextUI application.

nextui.org

 

 

3. ํ•ด๊ฒฐ

๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๋‹ˆ, 

https://github.com/nextui-org/nextui/issues/1871

 

[BUG] - Clicking a Tab link causes a full page reload when using Remix · Issue #1871 · nextui-org/nextui

NextUI Version 2.2.2 Describe the bug Tab links don't appear to work properly with Remix. As you can see in the example, the selected tab is eventually underlined, but it's not a smooth transition ...

github.com

์ด ๊นƒํ—™ ์ด์Šˆ๊ธ€์„ ๋ฐœ๊ฒฌ.

์•Œ๊ณ ๋ณด๋‹ˆ ๋‹ค๋ฅธ์‚ฌ๋žŒ๋“ค๋„ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ๋”ฐ๋ผํ–ˆ๋Š”๋ฐ ๋˜์ง€์•Š๋Š” ๋ฒ„๊ทธ?! ๋ฅผ ๊ฒช๊ณ ์žˆ์—ˆ๋‹ค.

 

๋Œ“๊ธ€์„ ๋ณด๋‹ˆ

useSearchParams() ๋ฅผ ์‚ฌ์šฉํ•ด ์•„๋งˆ url param์— ๋”ฐ๋ผ ํƒญ์ด ์„ ํƒ๋˜๋„๋ก ? ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋“ฏํ–ˆ๊ณ 

๊ทธ ์™ธ ๋ฐฉ๋ฒ•๋“ค๋„ ์žˆ์—ˆ๋Š”๋ฐ

 

 

๋‚˜๋Š” ์•„๋ž˜ ๋Œ“๊ธ€์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ๋จ

 

๐Ÿฐ

์ด๊ฒŒ ์ œ์ผ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์ธ ๋“ฏํ•˜๋‹ค! 

๊ณต์‹๋ฌธ์„œ๋Œ€๋กœ usePathname(); ์„ ์‚ฌ์šฉํ•˜๊ณ ,

๊ฐ ํƒญ์— as={Link} ์ถ”๊ฐ€ - ๋‹น์—ฐํžˆ import ํ•ด์˜ค๊ณ 

href์™€ key ์†์„ฑ์— ์ด๋™ํ•  ํŽ˜์ด์ง€ url ์จ์ฃผ๊ธฐ

 

 

์ฐธ๊ณ ๋กœ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์˜ ๋Œ“๊ธ€์ด ์•„๋ž˜์—๋„ ์žˆ๋Š”๋ฐ

 

์‚ฌ์‹ค ์ด ๋‘๋ฒˆ์งธ ๋Œ“๊ธ€์€ ํ•จ์ •์ด ์žˆ๋‹ค ^^;

key="about" ์ด๋ผ๊ณ  ํ•˜๋ฉด ์•ˆ๋จ. ๊ทธ ์œ„์˜ ๋Œ“๊ธ€์ฒ˜๋Ÿผ key="/about" ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฃผ์†Œ๋ฅผ ์จ์ค˜์•ผํ•จ.

href์™€ ๋˜‘๊ฐ™์ด key๋ฅผ ์จ์ค˜์•ผ๋งŒ ํ•ด๋‹น ํƒญ์„ ๋ˆ„๋ฅด๋ฉด ํƒญ์ด ์›€์ง์ด๋ฉฐ ํŽ˜์ด์ง€๋„ ์ด๋™๋จ!!

(๊ทผ๋ฐ ๊ณต์‹๋ฌธ์„œ๋„ ๊ทธ๋ ‡๊ณ  ์œ—๋Œ“๊ธ€๋„ ๊ทธ๋ ‡๊ณ  key ์™€ href ๋ฅผ ๊ผญ ์ผ์น˜์‹œํ‚ค์ง„์•Š๋˜๋ฐ, ๋‚ด ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ํ•ด์•ผ๋งŒ ์ ์šฉ์ด ๋˜์—ˆ์Œ ใ… ใ… )

 

์—ฌ๊ธฐ์„œ href ์†์„ฑ์€ ํ•„์ˆ˜์ด๊ณ , key ์†์„ฑ ๋˜ํ•œ href์™€ ๋˜‘๊ฐ™์ด ์จ์ค˜์•ผ ์ž˜ ์ ์šฉ๋œ๋‹ค๋Š” ์ ์ด ํ•ต์‹ฌ!

 

๊ทธ๋ฆฌ๊ณ  ๊ณต์‹๋ฌธ์„œ๋Œ€๋กœ 

const pathname = usePathname();

....

 <Tabs
          selectedKey={pathname}

....

 

usePathname ๋„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ์žŠ์ง€๋ง์ž

 

 

>

 

๋ฌธ์ œํ•ด๊ฒฐํ•œ ์ฝ”๋“œ

<div className="flex flex-col items-center justify-center">
        <Tabs
          selectedKey={pathname}
          size="md"
          radius="full"
          aria-label="Options"
          color="default"
          className="flex justify-center" 
        >
          <Tab
            key="/about"
            title="ABOUT"
            as={Link}
            href="/about"
            className="w-[10rem]"
          />
          ...
          
       </Tabs>

 

 

 


๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ

 

1. ์ƒํ™ฉ

์•„๋ž˜์ฒ˜๋Ÿผ Tabs์˜ ํ•˜๋‚˜์˜ Tab ์•ˆ์— ๋˜ tab ์„ ๋‘๊ณ ์‹ถ์—ˆ๋‹ค

์ด์ค‘ํƒญ!

 

๊ทผ๋ฐ ์œ„์—์„œ ํ•ด๊ฒฐํ•œ๋Œ€๋กœ selectedKey={pathname} ์™€ as={Link}์„ ํ™œ์šฉํ•ด ๋˜‘๊ฐ™์ด ์ ์šฉํ•ด๋ณด๋‹ˆ 

์ฒซ๋ฒˆ์งธ ํ•˜์œ„ ํƒญ์€  ์ƒ์œ„ ํƒญ์˜ href๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ

๋‘๋ฒˆ์งธ ํ•˜์œ„ ํƒญ ('๋‹จ์ฒด์™€ ํ•จ๊ป˜ํ•ด์š”')์€ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์ง€๋งŒ, ํƒญ์ด ๋˜‘๊ฐ™์ด ์›€์ง์ด์ง€์•Š๊ณ  ๊ทธ๋ƒฅ ์ƒˆ๋กœ๊ณ ์นจ๋˜๋ฉด์„œ ํ•˜์œ„ํƒญ๋“ค์ด ๋ชจ์Šต์„ ๊ฐ์ถฐ๋ฒ„๋ฆผ ..ใ… ใ… 

(์—ฌํŠผ ํ•˜์œ„ํƒญ์— ์ ์šฉ๋˜์ง€์•Š์•˜๋‹ค)

 

 

=> ์ด๊ฑด ์•„์ง ํ•ด๊ฒฐ๋ชปํ•จ. .... ๊ฝค ์‹œ๊ฐ„์„ ์จ๋ดค๊ณ  chat gpt ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ด๋„ ๋‹ต์„ ์–ป๊ธฐ์–ด๋ ค์› ๋‹ค

์ฑ—์ง€ํ”ผํ‹ฐ๋•๋ถ„์— useState ๋ฅผ ๋ถ€๋ชจ, ํ•˜์œ„ ํƒญ ๋”ฐ๋กœ ์ฃผ๋ฉด์„œ๋„ ํ•ด๋ดค์ง€๋งŒ ๋˜์ง€์•Š์Œ ใ… ใ…  

 ์ดํ›„์— ๋‹ค์‹œ ๊ณ ๋ฏผํ•ด๋ด์•ผํ• ๋“ฏ

 

 

 

SMALL