Front/React.js

[겨울방학-회사] react로 FAQ 리스트 만들기 : Accordion 구현

ddo04 2025. 2. 19. 16:54
    • 아코디언 디자인은 shadcn/ui의 Accordion을 사용하여 구현하였습니다

single 타입 ( Accordion Type = "single" )

<Accordion
	type="single"
    className="item-center m-6 flex flex-col gap-4"
>
</Accordion>
  • 한 번에 하나의 아코디언 아이템만 펼쳐진 상태로 유지됩니다
  • 새로운 아이템을 펼치면 이전에 펼쳐져 있던 아이템은 자동으로 접힙니다
  • 사용자가 한 번에 하나의 정보에만 집중하도록 유도합니다
사용 시나리오
  • FAQ 페이지
    • 사용자가 궁금한 질문을 클릭하면 답변이 펼쳐지고, 다른 질문을 클릭하면 이전 답변은 접히도록 하여 깔끔한 정보 제공이 가능합니다
  • 설정 매뉴
    • 여러 설정 옵션 중 현재 활성화된 옵션만 보여주고, 다른 옵션을 선택하면 이전 옵션은 숨깁니다
  • 단계별 폼
    • 복잡한 폼을 단계별로 나누어 한 번에 하나의 단계만 보여줌으로써 사용자의 집중도를 높이고 폼 작성 과정을 간소화합니다
장점
  • 정보의 집중도를 높여 사용자 경험을 향상시킵니다
  • 복잡한 정보를 깔끔하게 정리하여 시각적인 부분을 줄입니다
  • 모바일 환경과 같이 제한된 공간에서 정보를 효율적으로 표시할 수 있습니다
단점
  • 여러 정보를 동시에 비교하거나 참조해야 하는 경우 불편함을 느낄 수 있습니다
  • 사용자가 원하는 정보를 빠르게 찾기 어려울 수 있습니다
multiple 타입 ( Accordion Type="multiple" )

<Accordion
	type="multiple"
    className="item-center m-6 flex flex-col gap-4"
>
</Accordion>
  • 여러 개의 아코디언 아이템을 동시에 펼칠 수 있습니다
  • 각 아이템은 독립적으로 펼쳐지거나 접힐 수 있으며, 다른 아이템에 영향을 주지 않습니다
  • 사용자가 여러 정보를 동시에 비교하거나 참조해야 하는 경우 유용합니다
사용 예시
  • 필터 목록
    • 사용자가 여러 필터를 동시에 선택하여 검색 결과를 좁힐 수 있습니다
  • 약관 동의 페이지
    • 여러 약관을 동시에 펼쳐서 내용을 확인하고 동의할 수 있도록 합니다
  • 고급 설정 메뉴
    • 여러 설정 옵션을 동시에 변경하여 사용자 맞춤 설정을 가능하게 합니다
장점
  • 사용자에게 더 많은 유연성을 제공하여 다양한 정보를 동시에 확인할 수 있습니다
  • 정보 비교 및 참조가 필요한 경우 효율적인 사용자 경험을 제공합니다
  • 고급 사용자나 전문가를 위한 복잡한 설정을 제공하는 데 적합합니다
단점
  • 너무 많은 아이템을 동시에 펼치면 화면이 복잡해져 사용자 경험을 저해할 수 있습니다
  • 정보 과부하를 유발하여 사용자가 필요한 정보를 찾기 어려울 수 있습니다

 

전체코드
import {
  Accordion,
  AccordionItem,
  AccordionTrigger,
  AccordionContent,
} from "@/app/_components/ui/accordion";
import { FAQList } from "../../_consts/faqList";

export function FAQSection() {
  return (
    <div className="w-full">
      <h1 className="font-black text-center text-4xl m-5 font-sans">
        자주 묻는 질문
      </h1>
      <Accordion
        type="multiple"
        className="item-center m-6 flex flex-col gap-4"
      >
        {FAQList.map((FAQList) => (
          <AccordionItem key={FAQList.id} value={FAQList.id}>
            <AccordionTrigger className="bg-white font-bold p-3 text-base rounded-t-lg shadow-sm font-sans">
              {FAQList.title}
            </AccordionTrigger>
            <AccordionContent className="bg-white/40 font-bold p-3 text-sm rounded-b-lg shadow-md font-sans">
              {FAQList.content}
            </AccordionContent>
          </AccordionItem>
        ))}
      </Accordion>
    </div>
  );
}