DEV Community

Cover image for How to render array of components in React
collegewap
collegewap

Posted on Originally published at codingdeft.com

How to render array of components in React

You might often encounter scenarios to render a list of components. In this article, we will see how to do the same.

Project setup

Create a react app using the following command:



npx create-react-app react-components-array


Enter fullscreen mode Exit fullscreen mode

Now install the react-icons package:



npm install react-icons


Enter fullscreen mode Exit fullscreen mode

This is required since we will be displaying a list of icons.

Creating an array of components

Consider the following component:



const Item = ({ value }) => {
  return <li>{value}</li>
}


Enter fullscreen mode Exit fullscreen mode

We can create a list of items as shown below:



const items = [<Item key={1} value={1} />, <Item key={2} value={2} />]


Enter fullscreen mode Exit fullscreen mode

Rendering the component array

Rendering an array of components is as easy as rendering variables in React:



import React from "react"

const Item = ({ value }) => {
  return <li>{value}</li>
}

const App = () => {
  const items = [<Item key={1} value={1} />, <Item key={2} value={2} />]

  return <ul>{items}</ul>
}

export default App


Enter fullscreen mode Exit fullscreen mode

All you need to do is add the array within the flower brackets {items}.

You can dynamically create the array of components as shown below:



import React from "react"

const Item = ({ value }) => {
  return <li>{value}</li>
}

const App = () => {
  const items = Array.from({ length: 10 }).map((_, index) => (
    <Item key={index} value={index + 1} />
  ))

  return <ul>{items}</ul>
}

export default App


Enter fullscreen mode Exit fullscreen mode

Storing components in an Array of objects and rendering them

Consider the following array:



import {
  MdOutlinePhone,
  MdOutlineFavorite,
  MdOutlineContactPhone,
} from "react-icons/md"

const menu = [
  {
    name: "Recents",
    icon: MdOutlinePhone,
  },
  {
    name: "Favorites",
    icon: MdOutlineFavorite,
  },
  {
    name: "Contacts",
    icon: MdOutlineContactPhone,
  },
]


Enter fullscreen mode Exit fullscreen mode

If you want to render the icons stored inside the array, you can do so by using the following code:



return menu.map(item => {
  return (
    <li key={item.name}>
      <item.icon /> {item.name}
    </li>
  )
})


Enter fullscreen mode Exit fullscreen mode

The complete code would be:



import React from "react"
import {
  MdOutlinePhone,
  MdOutlineFavorite,
  MdOutlineContactPhone,
} from "react-icons/md"

const menu = [
  {
    name: "Recents",
    icon: MdOutlinePhone,
  },
  {
    name: "Favorites",
    icon: MdOutlineFavorite,
  },
  {
    name: "Contacts",
    icon: MdOutlineContactPhone,
  },
]

const App = () => {
  return menu.map(item => {
    return (
      <li key={item.name}>
        <item.icon /> {item.name}
      </li>
    )
  })
}

export default App


Enter fullscreen mode Exit fullscreen mode

If you run the app now, you will see the following output:

list of icons

Top comments (2)

Collapse
 
marlo-bb profile image
ِMarlo Ber

import React, { useState } from 'react';
import axios from 'axios';
import { useNavigate } from 'react-router-dom';
import Swal from 'sweetalert2';

function Register() {
const [fullName, setFullName] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [confirmPassword, setConfirmPassword] = useState('');

const navigate = useNavigate();
const apiUrl = 'https://683da3f6199a0039e9e64a3e.mockapi.io/login'; 

const btnSubmit = async (e) => {
    e.preventDefault();
    if (!fullName || !email || !password || !confirmPassword) {
        Swal.fire("Error", "Please fill in all fields", "error");
        return;
    }

    if (password.length < 6) {
        Swal.fire("Error", "Password must be at least 6 characters", "error");
        return;
    }

    if (password !== confirmPassword) {
        Swal.fire("Error", "Passwords do not match", "error");
        return;
    }

    try {

        const res = await axios.get(apiUrl);
        const userExist = res.data.find(user => user.email === email);

        if (userExist) {
            Swal.fire("Error", "Email already used", "error");
            return;
        }


        const response = await axios.post(apiUrl, {
            fullName,
            email,
            password,
        });

        Swal.fire("Success", "Registration successful", "success");
        localStorage.setItem("user", JSON.stringify(response.data));
        navigate("/");
    } catch (err) {
        console.error(err);
        Swal.fire("Error", "Something went wrong. Please try again.", "error");
    }
};

return (
    <div className="flex justify-center items-center min-h-screen">
        <div className="w-full max-w-md p-6 bg-white rounded shadow">
            <div className="text-center mb-6">

                <h2 className="text-2xl font-bold">تسجيل الدخول</h2>
            </div>

            <form onSubmit={btnSubmit} className="space-y-4">
                <div>
                    <label className="block mb-1">Full Name</label>
                    <input
                        type="text"
                        value={fullName}
                        placeholder="Full Name"
                        onChange={(e) => setFullName(e.target.value)}
                        className="w-full px-4 py-2 border rounded"
                        required
                    />
                </div>

                <div>
                    <label className="block mb-1">Email</label>
                    <input
                        type="email"
                        value={email}
                        placeholder="Email Address"
                        onChange={(e) => setEmail(e.target.value)}
                        className="w-full px-4 py-2 border rounded"
                        required
                    />
                </div>

                <div>
                    <label className="block mb-1">Password</label>
                    <input
                        type="password"
                        value={password}
                        placeholder="Password"
                        onChange={(e) => setPassword(e.target.value)}
                        className="w-full px-4 py-2 border rounded"
                        required
                    />
                </div>

                <div>
                    <label className="block mb-1">Confirm Password</label>
                    <input
                        type="password"
                        value={confirmPassword}
                        placeholder="Confirm Password"
                        onChange={(e) => setConfirmPassword(e.target.value)}
                        className="w-full px-4 py-2 border rounded"
                        required
                    />
                </div>

                <button
                    type="submit"
                    className="w-full bg-blue-500 text-white py-2 rounded hover:bg-red-600 transition"
                >
                    Register
                </button>
            </form>
        </div>
    </div>
);
Enter fullscreen mode Exit fullscreen mode

}

export default Register;

Collapse
 
mariaalba profile image
Maria

import React, { useState } from 'react';
import axios from 'axios';
import Swal from 'sweetalert2';
import { Link, useNavigate } from 'react-router';

export default function Signin() {
const [name, setName] = useState('');
const [password, setPassword] = useState('');
const navigate = useNavigate();

const handleSignin = async () => {
if (!name.trim() || !password.trim()) {
Swal.fire('خطأ', 'الرجاء إدخال الاسم وكلمة المرور.', 'error');
return;
}

try {
  const res = await axios.get('url');
  const users = res.data;

  const matchedUser = users.find(
    (user) => user.name === name && user.password === password
  );

  if (matchedUser) {

    localStorage.setItem('user', JSON.stringify(matchedUser));

    Swal.fire('تم بنجاح', 'مرحباً بعودتك!', 'success').then(() => {
    navigate('/');
    });

  } else {
    Swal.fire('خطأ', 'الاسم أو كلمة المرور غير صحيحة.', 'error');
  }
} catch {
  Swal.fire('خطأ', 'حدث خطأ ما، حاول مرة أخرى لاحقاً.', 'error');
}
Enter fullscreen mode Exit fullscreen mode

};

return (


Full Name
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="Full Name"
className='border-1 rounded-2xl w-80 p-2'
/>
     <label>Password</label>
            <input
              type="password"
              value={password}
              onChange={(e) => setPassword(e.target.value)}
              placeholder="Password"
              className='border-1 rounded-2xl w-80 p-2'
            />

            <button
               onClick={handleSignin}
                className="btn btn-soft btn-primary"> Sign  In</button>


          <div className="mt-4 text-sm text-gray-600"> Don't  have an account?
            <Link to="/signup"><button className="btn btn-soft btn-accent">Sign Up</button></Link>
         </div>

</div>

);
}