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
  • Explanation and Step-by-Step Procedure for BookCard and BookList Integration
  • Step 1: Create BookCard.jsx
  • Step 2: Modify BookList.jsx
  • Step-by-Step Explanation of BookCard.jsx Implementation
  1. RESTful APIs :Build a BookSearch App -Ver 2.0

Lesson 6 - Create BookCard.jsx Component

Explanation and Step-by-Step Procedure for BookCard and BookList Integration

Step 1: Create BookCard.jsx

The BookCard component displays individual book details in a card layout.

Key Features of BookCard.jsx:

  1. Props:

    • The book prop contains all the book details.

  2. Two-Column Layout:

    • Left Column: Displays the book's thumbnail image.

    • Right Column: Shows the book title, authors, description, and published year.

  3. Reusable Component:

    • Uses the ReadMore component for expandable descriptions.

  4. Prop Validation:

    • Ensures that book prop matches the expected structure.


// Layout Design of BookCard Component
BookCard Component
│
├── Props
│   └── book (object) - Contains book information
│       └── volumeInfo (object)
│           ├── title (string)
│           ├── authors (array of strings)
│           ├── description (string)
│           ├── publishedDate (string)
│           └── imageLinks (object)
│               └── thumbnail (string)
│
└── Render Structure
    └── <div> (card mb-3, maxWidth: '540px')
        └── <div> (row g-0)
            ├── Left Column: <div> (col-md-4) - Book Thumbnail
            │   └── <img> (img-fluid rounded-start)
            │       ├── src={imageLinks?.thumbnail || 'https://via.placeholder.com/128x200'}
            │       └── alt={title || 'No Thumbnail'}
            │
            └── Right Column: <div> (col-md-8) - Book Details
                └── <div> (card-body)
                    ├── <h5> (card-title) - Book title
                    │   └── {title || 'No Title Available'}
                    │
                    ├── <p> (card-text) - Authors
                    │   ├── <strong>Authors:</strong>
                    │   └── Conditional: {authors ? authors.join(', ') : 'Unknown'}
                    │
                    ├── <p> (card-text) - Description
                    │   ├── <strong>Description:</strong>
                    │   └── Conditional: {description ? <ReadMoreUpdate book={book} /> : 'No Description Available'}
                    │
                    └── <p> (card-text) - Published Year
                        └── <small> (text-muted)
                            ├── <strong>Published Year:</strong>
                            └── {publishedDate || 'Unknown'}

Step 2: Modify BookList.jsx

Integrate the BookCard component into BookList for displaying each book's details.

Key Changes in BookList.jsx:

  1. Import BookCard:

    import BookCard from './BookCard';
    • This allows BookList to use the BookCard component.

  2. Replace Card Rendering Logic:

    {books.map((book) => (
      <BookCard key={book.id} book={book} />
    ))}
    • For each book, render a BookCard component and pass the book object as a prop.

  3. Flexible Layout:

    • Books are displayed using a d-flex flex-wrap justify-content-center class for responsive alignment.


How It Works Together

  • BookList:

    • Iterates over the list of books and renders a BookCard for each.

  • BookCard:

    • Takes a single book object and displays its content in a card layout.

  • Advantages:

    • Reusability: The BookCard component can be reused in other contexts.

    • Separation of Concerns: Cleanly separates rendering logic for individual books.


Benefits for Students

  1. Component Hierarchy:

    • Understand how to compose larger components from smaller, reusable components.

  2. Bootstrap Layout:

    • Learn to use d-flex and flex-wrap for responsive layouts.

  3. Reusable Patterns:

    • Create modular components (BookCard) that simplify main component logic.

Step-by-Step Explanation of BookCard.jsx Implementation

The BookCard component displays detailed information about a book in a card-style layout.


Step 1. Import Necessary Libraries

import React from 'react';
import PropTypes from 'prop-types';
import ReadMore from './ReadMore';
  • React: Provides the base framework for building the component.

  • PropTypes: Ensures the props passed to the component are well-defined.

  • Bootstrap: Provides ready-to-use styles for the layout.

  • ReadMore: A component to manage expandable descriptions.


Step 2. Destructure Props

const { title, authors, description, publishedDate, imageLinks } = book.volumeInfo;
  • Extracts specific fields from the book.volumeInfo object for easy access.


Step 3. BookCard Layout

<div className="card mb-3" style={{ maxWidth: '540px' }}>
  <div className="row g-0">
    {/* Left Column: Thumbnail */}
    <div className="col-md-4">
      <img
        src={imageLinks?.thumbnail || 'https://via.placeholder.com/128x200'}
        alt={title || 'No Thumbnail'}
        className="img-fluid rounded-start"
      />
    </div>

    {/* Right Column: Book Details */}
    <div className="col-md-8">
      <div className="card-body">
        <h5 className="card-title">{title || 'No Title Available'}</h5>
        <p className="card-text">
          <strong>Authors:</strong> {authors ? authors.join(', ') : 'Unknown'}
        </p>
        <p className="card-text">
          <strong>Description:</strong> {description ? <ReadMore text={description} /> : 'No Description Available'}
        </p>
        <p className="card-text">
          <small className="text-muted">
            <strong>Published Year:</strong> {publishedDate || 'Unknown'}
          </small>
        </p>
      </div>
    </div>
  </div>
</div>
  • Left Column:

    • Displays the book's thumbnail image.

    • If the image is unavailable, a placeholder is used.

  • Right Column:

    • Contains details such as title, authors, description, and published year.

    • Uses ReadMore for expandable descriptions.


Step 4. Prop Validation

BookCard.propTypes = {
  book: PropTypes.shape({
    volumeInfo: PropTypes.shape({
      title: PropTypes.string,
      authors: PropTypes.arrayOf(PropTypes.string),
      description: PropTypes.string,
      publishedDate: PropTypes.string,
      imageLinks: PropTypes.shape({
        thumbnail: PropTypes.string,
      }),
    }).isRequired,
  }).isRequired,
};
  • Ensures the book prop contains all necessary fields with correct types.


5. Export the Component

export default BookCard;
  • Makes BookCard reusable across the application.


Integration with BookList

  • The BookList component uses BookCard to render individual book details.

  • For each book in the list, a BookCard is created with the book object as a prop.


Benefits for Students

  1. Reusability:

    • The modular BookCard can be reused wherever book details need to be displayed.

  2. Responsive Design:

    • The Bootstrap-based layout adapts to different screen sizes.

  3. Clean Code:

    • Prop validation ensures better maintainability and error checking.

This implementation completes the integration of BookCard with the app.

PreviousLesson 5 - Create BookList.jsx ComponentNextLesson 7 - Creating Custom Hooks - useBooks and api-client

Last updated 20 days ago