Simple & Easy Vite.js, React.js, Tailwind.css Tutorial with Data Fetching

Mason Aviles
7 min readMar 13, 2024

--

midjourney & me

Creating a modern, responsive, and visually appealing web application is a common goal for many developers. This tutorial combines the power of Vite, React, and Tailwind CSS to craft a sleek user interface that also performs data fetching efficiently. We’ll guide you through the setup of a Vite React application, integrate Tailwind CSS for styling, and finally, fetch and display data from an API.

Setting Up a Vite React Application

Vite offers a fast development environment for modern web projects. To kickstart a Vite project with React:

1. Creating the Project

First, you’ll need to create a new project using Vite with React. Open your terminal and run the following command. This will create a new directory for your project named my-vite-app and initialize it with a basic React template.

npm create vite@latest my-vite-app -- --template react

2. Navigating to Your Project

Change into your newly created project directory:

cd my-vite-app

3. Installing Dependencies

Inside your project directory, install the project dependencies:

npm install

4. Starting the Development Server

Now, you can start the Vite development server to see your app in action:

npm run dev

This command starts a local development server. By default, you can view your application by opening http://localhost:3000 in your browser.

Installing and Configuring Tailwind CSS

Tailwind CSS facilitates the rapid development of UIs without leaving your HTML (or JSX). Here’s how to add it to your project:

1. Installing Tailwind CSS and Its Peers

In your project directory, install Tailwind CSS along with PostCSS and Autoprefixer. These tools are necessary for Tailwind to function properly in your project.

npm install -D tailwindcss@latest postcss@latest autoprefixer@latest

2. Generating Configuration Files

Next, generate the Tailwind CSS and PostCSS configuration files. This step creates tailwind.config.js and postcss.config.js in your project root, which you'll configure in the next step.

npx tailwindcss init -p

3. Configuring Tailwind to Remove Unused Styles

Open the tailwind.config.js file that was generated in the previous step. Configure the content option to specify the files Tailwind should scan for class names. By doing this, Tailwind can remove unused styles in production, significantly reducing the size of your CSS file.

module.exports = {
content: [
"./index.html",
"./src/**/*.{js,jsx,ts,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}

4. Adding Tailwind Directives to Your CSS

Tailwind CSS works by injecting utility classes into your markup. To make it available in your project, you need to add Tailwind’s directives to your CSS. Open (or create) the ./src/index.css file and add the following:

@tailwind base;
@tailwind components;
@tailwind utilities;

This tells Tailwind to include its base styles, component classes, and utility classes in your stylesheet.

5. Importing the CSS File

Finally, make sure that your main stylesheet (index.css) is imported in your project so the styles are actually applied. This should already be the case in a Vite React template, but you can ensure it by checking that the following line exists in your src/main.jsx or src/index.js file:

import './index.css';

After completing these steps, your Vite React application will be equipped with Tailwind CSS, enabling you to use its utility-first classes for styling your components. You now have a powerful, modern development setup ready for building React applications with ease and efficiency.

Fetching and Displaying API Data with React

Integrating API data fetching in your React app demonstrates how to work with external data. We’ll use TypeScript for added type safety and clarity.

Defining TypeScript Interfaces

First, define an interface to structure the API data. For a post-fetching example, it could look like this:

interface Post {
id: number;
title: string;
body: string;
}

Creating the Data Fetching Component

Using React’s useState and useEffect hooks, you can fetch and display data from an API:

import React, { useEffect, useState } from 'react';

const DataFetchingComponent: React.FC = () => {
const [data, setData] = useState<Post[]>([]);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/posts')
.then(response => response.json())
.then(json => setData(json));
}, []);
return (
<div>
{data.map(item => (
<div key={item.id}>
<h2>{item.title}</h2>
<p>{item.body}</p>
</div>
))}
</div>
);
};
export default DataFetchingComponent;

Understanding the Component

  • useState: Initializes the data state to hold our posts.
  • useEffect: Fetches data from the API upon component mount and updates the data state.
  • Rendering: Maps over the data state to display each post in the UI, ensuring each item has a unique key for React's rendering optimization.

Enhancing React Components with Tailwind CSS

Once you’ve set up your Vite React application and integrated Tailwind CSS, you can start the fun part: styling your components. Tailwind’s utility-first approach allows you to apply styles directly within your JSX, making it straightforward to create visually appealing components. In this section, we’ll demonstrate how to use Tailwind CSS to style a data-fetching component, enhancing its look and feel with minimal effort.

Beautifying DataFetchingComponent with Tailwind CSS

Our DataFetchingComponent fetches data from an API and displays it. Initially functional but visually basic, we can transform it using Tailwind CSS to improve its appearance. Here's the component before and after applying Tailwind classes:

// Before Tailwind CSS
<div>
{data.map(item => (
<div key={item.id}>
<h2>{item.title}</h2>
<p>{item.body}</p>
</div>
))}
</div>

By introducing Tailwind CSS classes, we inject style directly into the JSX, offering an immediate visual upgrade:

// After Tailwind CSS
<div className="flex flex-col items-center justify-center my-8">
{data.map(item => (
<div key={item.id} className="bg-white rounded-lg shadow-md p-6 mb-4 w-full max-w-xl">
<h2 className="text-gray-700 font-bold text-xl mb-2">{item.title}</h2>
<p className="text-gray-700 text-base">{item.body}</p>
</div>
))}
</div>

Breakdown of Tailwind CSS Classes Used

  • Layout and Spacing: flex flex-col items-center justify-center my-8 creates a centered, column-oriented flex container with vertical margins.
  • Card Styling: Each item is styled with bg-white rounded-lg shadow-md p-6 mb-4 w-full max-w-xl to create a card-like appearance, featuring a white background, rounded corners, a shadow for depth, padding, and margin for spacing.
  • Text Styling: Titles receive font-bold text-xl mb-2 for bold, large text with bottom margin, and body text is styled with text-gray-700 text-base for a dark gray color and base font size.

Benefits of Tailwind CSS in React

Tailwind CSS shines by providing developers with the ability to rapidly style and prototype UIs directly in the markup. This approach eliminates the need to switch contexts between CSS files and JSX, speeding up the development process. Moreover, Tailwind’s utility classes are designed to be responsive, making it easier to build applications that look great on any device.

By integrating Tailwind CSS into your Vite React projects, you can harness the power of utility-first styling to create intricate designs with simple, readable class strings. Whether you’re building a small project or a large-scale application, Tailwind CSS and React are a formidable combination for efficient and scalable front-end development.

This transformation of the DataFetchingComponent demonstrates just a fraction of what's possible with Tailwind CSS in React applications. As you become more familiar with Tailwind's classes, you'll find yourself capable of rapidly iterating on your designs and bringing your UI visions to life with ease.

Conclusion

Combining Vite, React, and Tailwind CSS with TypeScript for data fetching yields a fast, stylish, and robust web application development experience. This tutorial outlined the foundational steps to set up your development environment, incorporate a styling framework, and handle dynamic data. This approach empowers developers to craft sophisticated web applications that are both beautiful and data-driven.

By following these steps, you’ve not only set up a powerful development stack but also embraced modern JavaScript frameworks and libraries to enhance your web development skills.

Extra Credit Homework: Enhancing React Components with Props and Tailwind CSS

Objective

Your task is to enhance a React functional component by introducing props for dynamic data fetching and apply Tailwind CSS for styling. This exercise aims to solidify your understanding of React’s props system, the use of hooks for side effects, and integrating utility-first CSS with Tailwind for responsive design.

Instructions

  1. Set Up Environment: Ensure you have a Vite React application set up. If you haven’t set one up yet, refer to the section on setting up a Vite React application in this blog.
  2. Tailwind CSS Integration: Follow the steps outlined in the blog to integrate Tailwind CSS into your project. Make sure you can apply Tailwind classes to elements in your application.
  3. Data Fetching Component Creation:
  • Create a DataFetchingComponent functional component that fetches data from an API.
  • The component should accept an apiUrl prop, which is a string representing the URL from which to fetch data.
  • Use the useState and useEffect hooks from React to manage the fetched data and the fetching process, respectively.
  • Type the component props using TypeScript for added type safety.

4. Applying Tailwind CSS:

  • Style the DataFetchingComponent using Tailwind CSS. Focus on layout, spacing, typography, and shadow classes to create an appealing UI.
  • Ensure the design is responsive and looks good on both mobile and desktop viewports.

5. Error Handling: Implement error handling in your data fetching logic to manage and display any fetch errors gracefully.

6. Component Usage:

  • Render the DataFetchingComponent in your application's main component.
  • Pass a valid API URL as a prop to the DataFetchingComponent. You can use https://jsonplaceholder.typicode.com/posts for testing purposes.

Deliverables

  • A DataFetchingComponent that dynamically fetches data based on the apiUrl prop.
  • The component should be styled with Tailwind CSS and display the fetched data in a user-friendly format.
  • Include error handling to manage any issues that might arise during the data fetching process.

Evaluation Criteria

  • Functionality: The component correctly fetches and displays data based on the passed apiUrl prop.
  • TypeScript Usage: Props are properly typed using TypeScript interfaces.
  • Styling: The component is styled using Tailwind CSS and adheres to responsive design principles.
  • Error Handling: The component gracefully handles and displays errors that occur during the data fetching process.

This homework assignment will test your ability to integrate various technologies into a cohesive React component. It will also challenge you to apply best practices in API data fetching, error handling, and responsive design. Good luck!

--

--

Mason Aviles

Sr. Full Stack Engineer who specializes in the Front End