There are many approaches you can take when adding a component to your application, there is an abundance of component libraries you can use such as material-ui but sometimes it is better to just get your hands dirty and build your own one!
In this post, we are going to do exactly that and build our own dropdown component.
A dropdown is a staple in any web application and is most commonly used in menus to display a list of options to the user. A dropdown can also be used to display some information to the user that can be shown on a button click. They are used all across the web and you could also be asked to build one in your next interview!
I know that building a component such as a dropdown may seem intimidating, but in this post, we will take it step by step so you can follow along. The knowledge gained from this post will also help you build any custom components!
Ready? Let's go!
What will you learn?#
By the end of this post, you will be able to:
Build a functional component from scratch
Understand the anatomy of a dropdown
Build your own dropdown component
Add animation to our component
Armed with the above knowledge, you will have a newfound confidence when approaching building components in React.
What do you need to know?#
If you do not know any of the above but would like to learn, here are some great resources:
Now it's time to get started on our journey of building our very own dropdown component.
The anatomy of a dropdown#
Before building our dropdown component, it is important to discuss the different parts of a dropdown.
There are four key components to a menu dropdown:
Wrapper around our heading
This could be a button or an item in a navigation bar (normally will trigger the dropdown)
Wrapper around all of our items
An item in our list
Visually, we can imagine it like this:
The component structure could look like this:
The core functionality would be:
Clicking on the heading will toggle the list (show or hide)
Populate the list with items passed into the component
Clicking the heading again will close the list (sometimes clicking outside the list will also close the component)
The above is just theory, you can be as creative as you want when building your own component. When building custom components, it is really important to build the component to suit your use case as it may be quite different from the standard. It's good to use the best practice guidelines but also don't be afraid to be creative!
Basic Dropdown Component#
Let's first start with a very basic dropdown, we will click on a button that will show a pop up that tells the user something.
When building a basic dropdown component, there is one important piece of state. The important piece of state is whether the dropdown is open or not. We will also need to add a function to handle toggling this piece of state.
This will all live in our wrapper component, which in our case is
App. We can use
useState to manage the showing and hiding of the dropdown for us (check out the docs here for React hooks).
We will pass both
setShowdropdown as props to our component.
Now we need to build our
BasicDropdown component. The main thing we need is something to trigger our dropdown and also the content of our dropdown.
We are using a
button to trigger the dropdown and then we only show our content when
showDropdown is true. There is a little CSS with this too, the key part of the CSS is setting
position:relative on the
position:absolute on the
dropdown. We do this so that the
dropdown will always be positioned to the the
Visually, we now have:
That is it, not too bad, eh?
This is a very basic dropdown but still is very commonly used when displaying some information to a user.
You could reuse this in various places and even expand it by opening it up to additional props such as a custom color or custom text.
Why not try to add those additional props to the Codesandbox below, this will help further your knowledge of building custom components and making them reusable.
Dynamic Dropdown menu#
So we can use a lot of the knowledge we gained above to help build our dynamic dropdown. The big difference with this dropdown is that it will accept a
items and it will also have a transition when it is being open/closed. The
items prop will determine when it is rendered within our dropdown list. This could literally be anything. A very common scenario is sub-items for a navigation menu.
In our case we are going to make up some items:
We can then pass this into our dropdown component:
Our dropdown component will behave quite similar to the one before, except we will map over each item in our array and create an
We will initially set our
ul to have
0 so that it is hidden. When
true, we will set the
100px which will make it visible.
To achieve this, we will use the following CSS (nothing too fancy going on, mostly overriding default browser styles):
As you can see from above, we have set a
transition on our
height so that when the
height changes it will do it with an
ease transition which will last
300ms. You don't need to always use the
animation property. In simple cases where only one attribute is changing in a predictable manner, we can use
Visually, we now have this:
One important part to note is the
overflow:auto. As we get a lot of items being passed to our list, we can then scroll our dropdown to suit this.