TwitterFacebookHatena

手軽に実装!Next.js と TypeScript でアコーディオンを作る方法

  • HOME >
  • ブログ一覧 >
  • 手軽に実装!Next.js と TypeScript でアコーディオンを作る方法

アコーディオンの基本構造

アコーディオンは、クリックやタップによってコンテンツが展開・縮小される UI コンポーネントです。まず、アコーディオンの基本構造を作成していきましょう。以下のコードはアコーディオンの構造を定義したコンポーネントです。

type AccordionProps = {
  title: string
  content: string
  isOpen: boolean
  onToggle: () => void
}

const Accordion = ({ title, content, isOpen, onToggle }: AccordionProps) => {
  return (
    <div>
      <button onClick={onToggle}>{title}</button>
      {isOpen && <div>{content}</div>}
    </div>
  )
}

アコーディオンの状態管理

続いて、アコーディオンの状態を管理するための機能を追加します。React の useState フックを利用して、アコーディオンが開いているか閉じているかを管理することができます。

import { useState } from 'react'

type AppProps = {
  title: string
  content: string
}

const App = ({ title, content }: AppProps) => {
  const [isOpen, setIsOpen] = useState(false)

  const handleToggle = () => {
    setIsOpen(!isOpen)
  }

  return (
    <div>
      <Accordion title={title} content={content} isOpen={isOpen} onToggle={handleToggle} />
    </div>
  )
}

複数のアコーディオンを管理

複数のアコーディオンを表示し、それぞれの状態を管理する方法を見ていきましょう。まず、アコーディオンのデータを配列で定義します。

const accordionsData = [
  {
    title: 'タイトル1',
    content: 'コンテンツ1',
  },
  {
    title: 'タイトル2',
    content: 'コンテンツ2',
  },
  {
    title: 'タイトル3',
    content: 'コンテンツ3',
  },
]

次に、useState フックを使って、複数のアコーディオンの開閉状態を管理します。また、map メソッドを使って、アコーディオンのデータをループして表示しましょう。

import { useState } from 'react'

type AccordionData = {
  title: string
  content: string
}

type AppProps = {
  accordionsData: AccordionData[]
}

const App = ({ accordionsData }: AppProps) => {
  const [openIndexes, setOpenIndexes] = useState<number[]>([])

  const handleToggle = (index: number) => {
    const currentIndex = openIndexes.indexOf(index)
    const newOpenIndexes = [...openIndexes]

    if (currentIndex === -1) {
      newOpenIndexes.push(index)
    } else {
      newOpenIndexes.splice(currentIndex, 1)
    }

    setOpenIndexes(newOpenIndexes)
  }

  return (
    <div>
      {accordionsData.map((accordionData, index) => (
        <Accordion key={index} title={accordionData.title} content={accordionData.content} isOpen={openIndexes.includes(index)} onToggle={() => handleToggle(index)} />
      ))}
    </div>
  )
}

このコードでは、openIndexes という配列を使って、開いているアコーディオンのインデックスを管理しています。handleToggle 関数では、引数で渡されたインデックスが openIndexes 配列に含まれているかどうかを確認し、含まれている場合は配列から削除し、含まれていない場合は配列に追加しています。

まとめ

この記事では、Next.js と TypeScript を使って、アコーディオンを実装する方法を解説しました。アコーディオンの基本構造を定義し、useState フックを使って開閉状態を管理し、複数のアコーディオンを表示できるようにしました。この実装方法を参考に、独自のアコーディオンコンポーネントを作成してみてください。

手軽に実装!Next.js と TypeScript でアコーディオンを作る方法