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 ๋ฅผ ๋ถ๋ชจ, ํ์ ํญ ๋ฐ๋ก ์ฃผ๋ฉด์๋ ํด๋ดค์ง๋ง ๋์ง์์ ใ ใ
์ดํ์ ๋ค์ ๊ณ ๋ฏผํด๋ด์ผํ ๋ฏ