Project-Based Learning: Building an Accordion Component

ShriShri
3 min read

Table of contents

What's the best way to learn to code?
Project-based learning!

This is something we have always come across. I have encountered many blogs where devs have shared their journey of building products from scratch through blog posts and videos. In my journey, I am at the stage where I have started building projects to gain confidence in the skills that I have learned so far and what way is better than sharing the projects I build! So here I am trying my best to share my process and journey of getting better at react.

Now focusing on the main event, I will be building an accordion component. This component looks like this,

For building such a component we need some data that can be used as an example, I have used the following sample data for this practice session,

const data = [
  {
    id: "1",
    question: "What are accordion components?",
    answer:
      "Accordion components are user interface elements used for organizing and presenting content in a collapsible manner. They typically consist of a header, content, and an expand/collapse action.",
  },
  {
    id: "2",
    question: "What are they used for?",
    answer:
      "They are commonly employed in various contexts, including FAQs, product descriptions, navigation menus, settings panels, and data tables, to save screen space and provide a structured and user-friendly interface for presenting information or options.",
  },
  {
    id: "3",
    question: "Accordion as a musical instrument",
    answer:
      "The accordion is a musical instrument with a keyboard and bellows. It produces sound by air passing over reeds when the player expands or compresses the bellows, used in various music genres.",
  },
  {
    id: "4",
    question: "Can I create an accordion component with a different framework?",
    answer:
      "Yes, of course, it is very possible to create an accordion component with another framework.",
  },
];

export default data;

Here I have 3 params mainly id, question, and answer. My approach is gonna be to render an unordered list (ul) while running a loop to render the data with the help of the map method. I also used the useState hook to enable single selection so that at a time only one of the accordion questions displays their respective answers. The final code for the accordion component made is as follows,

import React, { useState } from "react";
import data from "./data";

function Accordian() {
  const [select, setSelect] = useState(null);
  const singleSelection = (getCurrentId) => {
    setSelect(getCurrentId === select ? null : getCurrentId);
    console.log(getCurrentId);
  };

  return (
    <div>
      <ul>
        <div>
          {data.map(({ id, question, answer }) => (
            <div>
              <button onClick={() => singleSelection(id)}>
                {question}
                <span>-</span>
              </button>
              {select === id ? <div>{answer}</div> : null}
            </div>
          ))}
        </div>
      </ul>
    </div>
  );
}

export default Accordian;

This was a fairly simple project I built but it really made me happy as I was able to do this all by myself without any help and thus I am sharing this here. Many more projects and articles to come xD

With that note, Thanks for your time, and happy learning!!

0
Subscribe to my newsletter

Read articles from Shri directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Shri
Shri

I am an aspiring software developer, currently learning Web dev. I write blogs sharing my knowledge as well as my tech journey.