ReactJS-The Beginner Master Class
  • React In the Beginning
    • Lesson 1 - Demo: Build a Simple React App - Fast
    • Lesson 2 - HTML Review
    • Lesson 3 - CSS Review
    • Lesson 4 - Modern JavaScript (JSX) Patterns
    • Lesson 5 - Set up Dev Environment
    • Hands-on Practice
  • React Fundamentals
    • Lesson 1 - Understanding Old vs New Way of Building Web Apps - SPAs
    • Lesson 2 - Motivation for Using React as the Solution to Vanilla JS
    • Lesson 3 - What is ReactJS - How it Works
    • React Code Along from Scratch
    • Lesson 4 - Create and Run a React Project with Vite - Full Overview
    • Lesson 5 - Create Hook by State Management in React
    • Lesson 6 - React Project File and Folder Walkthrough
    • Lesson 7 - JSX and How React Treats the DOM & JSX Compilation(by Babeljs) - Overview
    • Lesson 8 - Understanding the Main Files - App.jsx and main.jsx
    • Lesson 9 - Props and One-Way Data Flow - Overview
    • Lesson 10 - Google Bookshelf App - Ver 1.0
    • Hands-on Practice I
    • Hands-on Practice II
  • React State and Styling
    • Lesson 1 - Pulling Book Data from a Different Data File
    • Lesson 2 - Overview of How State Works in React
    • Lesson 3 - RandomQuote App
    • Lesson 4 - Lifting State Up - React Pattern Overview
    • Hands-On - Simple Counter
  • Forms and Interactivity - Grocery List App
    • Lesson 1 - Setup a Simple Form and Input
    • Lesson 2 - Build Form Profile App Using Multi-input Form Data
    • Hands-on : Build a Grocery List App
  • Connecting to the Backend - Consuming APIs - UseEffect Hook
    • Lesson 1 - Connecting to the Back End - Understanding Side Effects, Hooks and useEffect - Overview
    • Lesson 2 - Fetching Data from the Backend the Right Way with useEffect Hook
    • Lesson 3 - Setting Up Loading State
    • Hands-on :Use Dependency Array and Adding Values that Control Side Effects
  • Solo Project 1
  • RESTful APIs :Build a BookSearch App -Ver 2.0
    • Lesson 1: Build and test RESTful APIs with Postman
    • Lesson 2 - BookShelf App Structure
    • Lesson 3 - Create NavBar.jsx Component
    • Lesson 4 - Create Footer Component
    • Lesson 5 - Create BookList.jsx Component
    • Lesson 6 - Create BookCard.jsx Component
    • Lesson 7 - Creating Custom Hooks - useBooks and api-client
    • Lesson 8 - Controlling Network Activities in React with AbortController
    • Lesson 9 - Show Book Details in a Modal - Working
    • Lesson 10 - Bookshelf App Summary
  • Multi-Page Applications (MPAs)
    • Build a Multi-Page React Application
    • Multi-Page React Application
    • Hands-on Practice
  • Backend Frameworks-NEXT.JS
    • Migrating from React to Next.js
    • Lesson 1: Key Concepts of NodeJS and Express for Backend Web Development
    • Lesson 2: How to set up a new Next.js project
    • Lesson 3: How to create Layouts and Pages
    • Hands-on Practice 1
    • Hands on Practice 2
      • New Project & Folder Structure
      • File-Based Routing
      • Server vs Client Components & Router Hooks
      • Start On The Navbar
      • Navbar Links, Dropdowns & React Icons
      • Active Links & Conditional Rendering
      • Homepage Components
      • Properties Page
      • Property Card Dynamic Data
      • Home Property Listings
      • Custom Not Found & Loading Pages
  • Git and GitHubs
    • Git Installation
    • Git Commands
    • GitHub Repository
    • Hands-on Practice
  • Database in Application
    • React Supabase CRUD
    • Hands-on: Note Taking App
  • NoSQL Database
    • Installing MongoDB Community Edition
    • System Env Path Setting
    • How to use MongoDB Shell
    • How to Connect and Use Mongosh in VS Code via MongoDB Extension
    • MongoDB Guide
  • Solo Project 2
  • Deployment and Web Hosting
    • Lesson 1. React+Vite+TS+Shadcn Project
    • Lesson 2. Deploying a React Vite App to Vercel from Vercel CLI
    • Lesson 3 Connecting to GitHub Repo and Automate Deployment
  • Solo Project 3
  • Final Term Project
    • Level 1 Team Project
    • Level 1 Team Project
    • Level 1 Team Project
    • Level 1 Team Project
    • Level 2 Team Project
    • Level 2 Team Project
    • Level 3 Team Project
    • Level 3 Team Project
Powered by GitBook
On this page
  • Navbar Enhancement and Adding More Features
  • 1. Convert Static Links to Next.js Link Components
  • 2. Integrate React Icons for Stylish Visuals
  • 3. Implement Dropdown Menus with React State
  • 4. Testing and Finalizing
  • Recap
  1. Backend Frameworks-NEXT.JS
  2. Hands on Practice 2

Navbar Links, Dropdowns & React Icons

Navbar Enhancement and Adding More Features

1. Convert Static Links to Next.js Link Components

a. Import the Link Component

  • At the top of your Navbar file (e.g., components/Navbar.jsx), import Link from Next.js:

    import Link from 'next/link';

b. Replace <a> Tags with <Link>

  • Locate all anchor tags in your Navbar markup.

  • For each link, change the opening tag from <a href="/somepage.html"> to:

    <Link href="/somepage">
      <a>Some Page</a>
    </Link>
  • Example: Replace the logo link:

    <Link href="/">
      <a className="flex flex-shrink-0 items-center">
        <img className="h-10 w-auto" src="/images/logo-white.png" alt="PropertyPulse" />
        <span className="hidden md:block text-white text-2xl font-bold ml-2">PropertyPulse</span>
      </a>
    </Link>
  • Update all other links similarly (e.g., Home, Properties, Add Property, Messages, Profile, etc.) ensuring you remove the ".html" extension for a cleaner URL structure.


2. Integrate React Icons for Stylish Visuals

a. Install React Icons Package

  • Open your terminal and run:

    npm install react-icons

b. Import the Required Icon(s)

  • In your Navbar component, import the desired icon from the React Icons library. For example, to import the Google icon:

    import { FaGoogle } from 'react-icons/fa';

c. Replace Font Awesome CDN Markup with React Icons

  • Locate the section where the Google icon is referenced (previously using an <i> tag).

// before 
<i className="fa-brands fa-google text-white mr-2"></i>
  • Replace it with the React icon component:

    // after
    <FaGoogle className="text-white mr-2" />
  • This provides a more React-friendly, customizable icon without relying on an external CDN.


3. Implement Dropdown Menus with React State

a. Mark the Component as a Client Component

  • Since dropdown menus require interactivity (state management and event handling), add the "use client" directive at the top of your Navbar file:

    "use client";

b. Import React Hooks

  • Import useState from React:

    // component/Navbar.jsx
    import { useState } from 'react';

c. Create State for Dropdowns

  • Inside your Navbar component function, create two state variables—one for the mobile menu and one for the profile dropdown:

    //components/Navbar.jsx
    ...
    export default function Navbar() {
    
      const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
      const [isProfileMenuOpen, setIsProfileMenuOpen] = useState(false);
      
      return (
      ...

d. Toggle Dropdown Visibility with onClick

  • For the mobile menu button, add an onClick event that toggles the state:

    <button
      type="button"
      id="mobile-dropdown-button"
      onClick={() => setIsMobileMenuOpen(prev => !prev)}
      className="relative inline-flex items-center justify-center rounded-md p-2 text-gray-400 hover:bg-gray-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white"
      aria-controls="mobile-menu"
      aria-expanded={isMobileMenuOpen}
    >
      <span className="sr-only">Open main menu</span>
      {/* SVG icon here */}
    </button>
  • For the profile dropdown button (the one with the profile image), add a similar toggle:

    <button
      type="button"
      onClick={() => setIsProfileMenuOpen(prev => !prev)}
      className="relative flex rounded-full bg-gray-800 text-sm focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-gray-800"
      id="user-menu-button"
      aria-expanded={isProfileMenuOpen}
      aria-haspopup="true"
    >
      <span className="sr-only">Open user menu</span>
      <img className="h-8 w-8 rounded-full" src="/images/profile.png" alt="User Profile" />
    </button>

e. Conditionally Render Dropdown Menus

  • Wrap the dropdown menus in a conditional render block. For example, for the mobile menu:

    //{/* <!-- Mobile menu, show/hide based on menu state. --> */}
     
    {isMobileMenuOpen && (
      <div id="mobile-menu" className="block">
        {/* Mobile menu links go here */}
      </div>
    )}
  • Similarly, for the profile dropdown:

    // {/* <!-- Profile hide/show dropdown --> */}
    
    {isProfileMenuOpen && (
      <div
        id="user-menu"
        className="absolute right-0 z-10 mt-2 w-48 origin-top-right rounded-md bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5"
        role="menu"
        aria-orientation="vertical"
        aria-labelledby="user-menu-button"
      >
        <Link href="/profile">
          <a className="block px-4 py-2 text-sm text-gray-700" role="menuitem">Your Profile</a>
        </Link>
        <Link href="/saved-properties">
          <a className="block px-4 py-2 text-sm text-gray-700" role="menuitem">Saved Properties</a>
        </Link>
        <button className="block w-full text-left px-4 py-2 text-sm text-gray-700" role="menuitem">
          Sign Out
        </button>
      </div>
    )}

4. Testing and Finalizing

a. Save and Test

  • Save your changes and run your development server:

    npm run dev
  • Open http://localhost:3000 to verify:

    • The links navigate without full page reloads.

    • The React icons (e.g., FaGoogle) appear as expected.

    • Dropdown menus toggle when clicking the mobile menu button and the profile image.

b. Debug Any Issues

  • Check the browser console for errors (e.g., JSX attribute warnings, state issues).

  • Adjust CSS classes and component structure as needed to match your desired aesthetics.


Recap

  • Link Conversion: Replaced HTML anchor tags with Next.js’s <Link> for smoother client-side navigation.

  • React Icons: Installed and imported react-icons to replace the external Font Awesome CDN.

  • Dropdown Menus: Added interactive dropdowns for mobile and profile sections using React’s state hook and conditional rendering.

  • Testing: Verified the functionality in development mode and ensured no errors occur.

PreviousStart On The NavbarNextActive Links & Conditional Rendering

Last updated 2 months ago