Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 단어 제거
- 아래로펼치기
- js 문자열을 문자배열로
- 재귀스왑
- 5.3.8 Modifying Queries
- 레디스 확인
- ...점점점문법
- 중첩배열
- 프론트엔드 스쿨
- ubuntu타임존
- 객체의 밸류값만 찾기
- 코딩 어?
- 중첩배열평탄화
- 제로베이스
- indexOf()
- 우분투 시간 변경
- 스프링 데이타 JPA
- 깃 토큰 만료
- 객체의키값만 찾기
- sql 문자열 패턴 검색
- 문자열 중복
- 중복 문자열
- 중복된 단어
- lastIndexOf()
- 중복단어제거
- 중복문자제거
- 배엘에서 스왑
- @Moditying @Query
- 시퀄 문법
- 문자열순서바꾸기
Archives
- Today
- Total
코딩기록
반복되는 JSX 문법 .map으로 간략하게 본문
728x90
로그인시 로그인 종류를 몇가지 만들었다. 탭선택에 따라 form이 다르게 나온다.
중복된 코드
<ul className="flex flex-row gap-2 text-center px-4">
<li className="px-2" onClick={() => setActiveTab("email")}>
<div className={hover:text-[#0073e9] ${activeTab === "email" ? "text-[#0073e9]" : ""}}>
이메일 로그인
</div>
{activeTab === "email" && <div className="border-b border-blue-600 pb-2 "></div>}
</li>
<li className="px-2" onClick={() => setActiveTab("qr")}>
<div className={hover:text-[#0073e9] ${activeTab === "qr" ? "text-[#0073e9]" : ""}}>
QR코드 로그인
</div>
{activeTab === "qr" && <div className="border-b border-blue-600 pb-2 "></div>}
</li>
<li className="px-2" onClick={() => setActiveTab("nonMember")}>
<div
className={hover:text-[#0073e9] ${activeTab === "nonMember" ? "text-[#0073e9]" : ""}}
>
비회원 배송조회
</div>
{activeTab === "nonMember" && <div className="border-b border-blue-600 pb-2 "></div>}
</li>
</ul>
중복되는 부분은 li 다 이런 코드는 map으로 돌린다
1. 배열 리터럴을 만든다
const loginTypeList: { key: "email" | "qr" | "nonMember"; label: string }[] = [
{ key: "email", label: "이메일 로그인" },
{ key: "qr", label: "QR코드 로그인" },
{ key: "nonMember", label: "비회원 배송조회" },
];
2. map으로 돌려돌려
<ul className="flex flex-row gap-2 text-center px-4">
{loginTypeList.map(({ key, label }) => (
<li key={key} className="px-2" onClick={() => setActiveTab(key)}>
<div className={`hover:text-[#0073e9] ${activeTab === key ? "text-[#0073e9]" : ""}`}>
{label}
</div>
{activeTab === key && <div className="border-b border-blue-600 pb-2 "></div>}
</li>
))}
</ul>
이렇게 바꾸면
불필요한 반복 없이 깔끔하게 렌더링된다.
key 값으로 탭 전환하고, label로 한글 표시까지 매끄럽게 처리된다.
[전체 코드]
const AuthMenu = () => {
const [activeTab, setActiveTab] = useState<"email" | "qr" | "nonMember">("email");
const loginTypeList: { key: "email" | "qr" | "nonMember"; label: string }[] = [
{ key: "email", label: "이메일 로그인" },
{ key: "qr", label: "QR코드 로그인" },
{ key: "nonMember", label: "비회원 배송조회" },
];
return (
<div
className="flex flex-col items-center justify-center text-lg gap-4 py-5 w-fit mx-auto
border border-gray-200 "
>
<h1 className="text-3xl mb-3">로그인</h1>
{/* <AuthHeader /> */}
<ul className="flex flex-row gap-2 text-center px-4">
{loginTypeList.map(({ key, label }) => (
<li key={key} className="px-2" onClick={() => setActiveTab(key)}>
<div className={`hover:text-[#0073e9] ${activeTab === key ? "text-[#0073e9]" : ""}`}>
{label}
</div>
{activeTab === key && <div className="border-b border-blue-600 pb-2 "></div>}
</li>
))}
</ul>
덧)
현재 탭이 어떤 상태인지 기억하기 위해 useState를 사용.
useState는 사용자가 클릭한 탭의 상태(email, qr, nonMember)를 기억하고,
그 상태에 따라 어떤 UI를 보여줄지 결정하는 역할이다.
→ 상태 변경 → 리렌더 → UI 업데이트
동작)
→ 이벤트를 걸어서 클릭 이벤트로 상태를 업데이트하고,
→ React가 그에 따라 컴포넌트를 다시 렌더링.
React는 상태가 변경되면 자동으로 렌더링을 "다시" 한다
반응형
'프론트 > 리액트' 카테고리의 다른 글
Carousel) Swiper(스와이퍼)- 반응형 슬라이드(캐러셀) 라이브러리 (0) | 2025.06.18 |
---|---|
문법) 'use client'를 작성하는 이유- 서버 컴포넌트, 클라이언트 컴포넌트 (0) | 2025.06.11 |
css) input 포커스 시 움직임 수정 (0) | 2025.06.09 |
트러블슈팅 ) transition 적용 (2) | 2025.06.04 |
리액트) 훅 useRef, useState, useEffect, useLayoutEffect, useCallback, useMemo 란? (1) | 2025.06.04 |
Comments