Adding JavaScript To A Page & How React Projects Differ
React Projects Use a Build Process
Revisiting Variables & Values
Revisiting Functions & Parameters
Exercise: Working with Functions
More on the Arrow Function Syntax
Revisiting Objects & Classes
Arrays & Array Methods like map()
Destructuring in Function Parameter Lists
Revisiting Control Structures
Manipulating the DOM - Not With React!
Using Functions as Values
Defining Functions Inside Of Functions
Reference vs Primitive Values
Next-Gen JavaScript - Summary
It's All About Components! [Core Concept]
Setting Up The Starting Project
JSX & React Components [Core Concept]
Creating & Using a First Custom Component
A Closer Look: Components & File Extensions
Building & Using a Component
How React Handles Components & How It Builds A "Component Tree" [Core Concept]
Using & Outputting Dynamic Values [Core Concept]
Setting HTML Attributes Dynamically & Loading Image Files
Outputting Dynamic Content
Making Components Reusable with Props [Core Concept]
Alternative Props Syntaxes
Best Practice: Storing Components in Files & Using a Good Project Structure
Storing Component Style Files Next To Components
Component Composition: The special "children" Prop [Core Concept]
Reacting to Events [Core Concept]
Passing Functions as Values to Props
Passing Custom Arguments to Event Functions
Configuring Event Handlers
Best Practices & Event Handling
How NOT to Update the UI - A Look Behind The Scenes of React [Core Concept]
Managing State & Using Hooks [Core Concept]
Deriving & Outputting Data Based on State
Rendering Content Conditionally
CSS Styling & Dynamic Styling
Outputting List Data Dynamically
Conditional Content & Dynamic Lists
You Don't Have To Use JSX!
When Should You Split Components?
Splitting Components By Feature & State
Problem: Props Are Not Forwarded To Inner Elements
Forwarding Props To Wrapped Elements
Working with Multiple JSX Slots
Setting Component Types Dynamically
Setting Default Prop Values
Creating Flexible Components
Onwards To The Next Project & Advanced Concepts
Not All Content Must Go Into Components
Closer Look: public/ vs assets/ for Image Storage
New Project: First Steps Towards Our Tic-Tac-Toe Game
Concept Repetition: Splitting Components & Building Reusable Components
Concept Repetition: Working with State
Component Instances Work In Isolation!
Conditional Content & A Suboptimal Way Of Updating State
Best Practice: Updating State Based On Old State Correctly
User Input & Two-Way-Binding
Rendering Multi-Dimensional Lists
Best Practice: Updating Object State Immutably
Lifting State Up [Core Concept]
Avoid Intersecting States!
Prefer Computed Values & Avoid Unnecessary State Management
Deriving State From Props
Sharing State Across Components
Reducing State Management & Identifying Unnecessary State
Disabling Buttons Conditionally
Outsourcing Data Into A Separate File
Lifting Computed Values Up
Deriving Computed Values From Other Computed Values
Tic-Tac-Toe Game: The "Game Over" Screen & Checking for a Draw
Why Immutability Matters - Always!
When NOT To Lift State Up
An Alternative To Lifting State Up
Final Polishing & Improving Components
Module Introduction & Starting Project
Splitting CSS Code Across Multiple Files
Styling React Apps with Vanilla CSS - Pros & Cons
Vanilla CSS Styles Are NOT Scoped To Components!
Styling React Apps with Inline Styles
Dynamic & Conditional Inline Styles
Dynamic Styling with Inline Styles
Dynamic & Conditional Styling with CSS Files & CSS Classes
Dynamic Styling with CSS Classes
Scoping CSS Rules with CSS Modules
Introducing "Styled Components" (Third-party Package)
Creating Flexible Components with Styled Components
Dynamic & Conditional Styling with Styled Components
Styled Components: Pseudo Selectors Nested Rules & Media Queries
Creating Reusable Components & Component Combinations
Introducing Tailwind CSS For React App Styling
Adding & Using Tailwind CSS In A React Project
Tailwind: Media Queries & Pseudo Selectors
Dynamic & Conditional Styling with Tailwind
Migrating The Demo App to Tailwind CSS
Tailwind CSS: Pros & Cons
Module Introduction & Starting Project
Repetition: Managing User Input with State (Two-Way-Binding)
Introducing Refs: Connecting & Accessing HTML Elements via Refs
Manipulating the DOM via Refs
Accessing DOM Elements with "refs"
Adding Challenges to the Demo Project
Setting Timers & Managing State
Using Refs for More Than "DOM Element Connections"
Managing Other Values with Refs
Forwarding Refs to Custom Components
Exposing Component APIs via the useImperativeHandle Hook
More Examples: When To Use Refs & State
Sharing State Across Components
Enhancing the Demo App "Result Modal"
Closing the Modal via the ESC (Escape) Key
Introducing & Understanding "Portals"
Module Introduction & Starting Project
Adding a "Projects Sidebar" Component
Styling the Sidebar & Button with Tailwind CSS
Adding the "New Project" Component & A Reusable "Input" Component
Styling Buttons & Inputs with Tailwind CSS
Splitting Components to Split JSX & Tailwind Styles (for Higher Reusability)
Managing State to Switch Between Components
Collecting User Input with Refs & Forwarded Refs
Handling Project Creation & Updating the UI
Validating User Input & Showing an Error Modal via useImperativeHandle
Styling the Modal via Tailwind CSS
Making Projects Selectable & Viewing Project Details
Handling Project Deletion
Adding "Project Tasks" & A Tasks Component
Managing Tasks & Understanding Prop Drilling
Clearing Tasks & Fixing Minor Bugs
Understanding Prop Drilling & Project Overview
Prop Drilling: Component Composition as a Solution
Introducing the Context API
Creating & Providing The Context
Linking the Context to State
A Different Way Of Consuming Context
What Happens When Context Values Change?
Migrating the Entire Demo Project to use the Context API
Outsourcing Context & State Into a Separate Provider Component
Introducing the useReducer Hook
Dispatching Actions & Editing State with useReducer
Module Introduction & Starting Project
What's a "Side Effect"? A Thorough Example
A Potential Problem with Side Effects: An Infinite Loop
Using useEffect for Handling (Some) Side Effects
Not All Side Effects Need useEffect
useEffect Not Needed: Another Example
Preparing Another Use-Case For useEffect
Using useEffect for Syncing With Browser APIs
Understanding Effect Dependencies
Preparing Another Problem That Can Be Fixed with useEffect
Introducing useEffect's Cleanup Function
The Problem with Object & Function Dependencies
useEffect's Cleanup Function: Another Example
Module Introduction & Starting Project
A First Component & Some State
Deriving Values Outputting Questions & Registering Answers
Shuffling Answers & Adding Quiz Logic
Working with Effect Dependencies & useCallback
Using Effect Cleanup Functions & Using Keys for Resetting Components
Highlighting Selected Answers & Managing More State
Splitting Components Up To Solve Problems
Moving Logic To Components That Actually Need It ("Moving State Down")
Setting Different Timers Based On The Selected Answer
React Builds A Component Tree / How React Works Behind The Scenes
Analyzing Component Function Executions via React's DevTools Profiler
Avoiding Component Function Executions with memo()
Avoiding Component Function Executions with Clever Structuring
Understanding the useCallback() Hook
Understanding the useMemo() Hook
React Uses A Virtual DOM - Time To Explore It!
Why Keys Matter When Managing State!
More Reasons For Why Keys Matter
Using Keys For Resetting Components
State Scheduling & Batching
Optimizing React with MillionJS
How (Not) To Connect To A Database
Starting Project & Dummy Backend API
Preparing the App For Data Fetching
How NOT To Send HTTP Requests (And Why It's Wrong)
Sending HTTP Requests (GET Request) via useEffect
Transforming Fetched Data
Extracting Code & Improving Code Structure
Sending Data with POST Requests
Using Optimistic Updating
Deleting Data (via DELETE HTTP Requests)
Module Introduction & Starting Project
What Are Forms & What's Tricky About Them?
Managing & Getting User Input via State & Generic Handlers
Getting User Input via Refs
Getting Values via FormData & Native Browser APIs
Validating Input on Every Keystroke via State
Validating Input Upon Lost Focus (Blur)
Validating Input Upon Form Submission
Validating Input via Built-in Validation Props
Mixing Custom & Built-in Validation Logic
Building & Using a Reusable Input Component
Outsourcing Validation Logic
Creating a Custom useInput Hook
Using Third-Party Form Libraries
Module Introduction & Starting Project
Planning the App & Adding a First Component
Fetching Meals Data (GET HTTP Request)
Adding a "MealItem" Component
Formatting & Outputting Numbers as Currency
Creating a Configurable & Flexible Custom Button Component
Getting Started with Cart Context & Reducer
Finishing & Using the Cart Context & Reducer
Adding a Reusable Modal Component with useEffect
Opening the Cart in the Modal via a New Context
Working on the Cart Items
Adding a Custom Input Component & Managing Modal Visibility
Handling Form Submission & Validation
Sending a POST Request with Order Data
Adding a Custom HTTP Hook & Avoiding Common Errors
Handling HTTP Loading & Error States
Another Look At State In React Apps
MUST READ: Redux createStore() is (not) deprecated
Exploring The Core Redux Concepts
Creating a Redux Store for React
Using Redux Data in React Components
Dispatching Actions From Inside Components
Redux with Class-based Components
Attaching Payloads to Actions
Working with Multiple State Properties
How To Work With Redux State Correctly
Redux Challenges & Introducing Redux Toolkit
Connecting Redux Toolkit State
Migrating Everything To Redux Toolkit
Working with Multiple Slices
Reading & Dispatching From A New Slice
Redux & Side Effects (and Asynchronous Code)
Refresher / Practice: Part 1/2
Refresher / Practice: Part 2/2
Using Firebase as a Backend
Frontend Code vs Backend Code
Using useEffect with Redux
A Problem with useEffect()
Handling Http States & Feedback with Redux
Using an Action Creator Thunk
Getting Started with Fetching Data
Finalizing the Fetching Logic
Exploring the Redux DevTools
Routing: Multiple Pages in Single-Page Applications
Project Setup & Installing React Router
Exploring an Alternative Way of Defining Routes
Navigating between Pages with Links
Showing Error Pages with errorElement
Working with Navigation Links (NavLink)
Navigating Programmatically
Defining & Using Dynamic Routes
Adding Links for Dynamic Routes
Understanding Relative & Absolute Paths
Working with Index Routes
Onwards to a new Project Setup
Time to Practice: Problem
Time to Practice: Solution
Data Fetching with a loader()
Using Data From A Loader In The Route Component
Where Should loader() Code Be Stored?
When Are loader() Functions Executed?
Reflecting The Current Navigation State in the UI
Returning Responses in loader()s
Which Kind Of Code Goes Into loader()s?
Error Handling with Custom Errors
Extracting Error Data & Throwing Responses
The json() Utility Function
Dynamic Routes & loader()s
The useRouteLoaderData() Hook & Accessing Data From Other Routes
Working with action() Functions
Submitting Data Programmatically
Updating the UI State Based on the Submission Status
Validating User Input & Outputting Validation Errors
Reusing Actions via Request Methods
Behind-the-Scenes Work with useFetcher()
Deferring Data Fetching with defer()
Controlling Which Data Should Be Deferred
Upgrading from React Router v5
Installing & Using Tanstack Query - And Seeing Why It's Great!
Understanding & Configuring Query Behaviors - Cache & Stale Data
Dynamic Query Functions & Query Keys
The Query Configuration Object & Aborting Requests
Enabled & Disabled Queries
Changing Data with Mutations
Fetching More Data & Testing the Mutation
Acting on Mutation Success & Invalidating Queries
A Challenge! The Solution
Disabling Automatic Refetching After Invalidations
Enhancing the Demo App & Repeating Mutation Concepts
React Query Advantages In Action
Updating Data with Mutations
Using the Query Key As Query Function Input
React Query & React Router
Creating a NextJS Project
Understanding File-based Routing & React Server Components
Adding Another Route via the Filesystem
Working with Pages & Layouts
Reserved File Names Custom Components & How To Organize A NextJS Project
Configuring Dynamic Routes & Using Route Parameters
Onwards to the Main Project: The Foodies App
Revisiting The Concept Of Layouts
Adding a Custom Component To A Layout
Styling NextJS Project: Your Options & Using CSS Modules
Optimizing Images with the NextJS Image Component
Using More Custom Components
Populating The Starting Page Content
Preparing an Image Slideshow
React Server Components vs Client Components - When To Use What
Using Client Components Efficiently
Outputting Meals Data & Images With Unknown Dimensions
Setting Up A SQLite Database
Fetching Data By Leveraging NextJS & Fullstack Capabilities
Using Suspense & Streamed Responses For Granular Loading State Management
Handling "Not Found" States
Loading & Rendering Meal Details via Dynamic Routes & Route Parameters
Throwing Not Found Errors For Individual Meals
Getting Started with the "Share Meal" Form
Getting Started with a Custom Image Picker Input Component
Adding an Image Preview to the Picker
Improving the Image Picker Component
Introducing & Using Server Actions for Handling Form Submissions
Storing Server Actions in Separate Files
Creating a Slug & Sanitizing User Input for XSS Protection
Storing Uploaded Images & Storing Data in the Database
Managing the Form Submission Status with useFormStatus
Adding Server-Side Input Validation
Working with Server Action Responses & useFormState
Building For Production & Understanding NextJS Caching
Triggering Cache Revalidations
Don't Store Files Locally On The Filesystem!
Bonus: Storing Uploaded Images In The Cloud (AWS S3)
About the NextJS Pages Router
Creating a NextJS Project
Analyzing the Created Project
Adding Nested Paths & Pages (Nested Routes)
Creating Dynamic Pages (with Parameters)
Extracting Dynamic Parameter Values
Onwards to a bigger Project!
Preparing the Project Pages
Outputting a List of Meetups
Adding the New Meetup Form
The "_app.js" File & Layout Wrapper
Using Programmatic (Imperative) Navigation
Adding Custom Components & CSS Modules
How Pre-rendering Works & Which Problem We Face
Data Fetching for Static Pages
More on Static Site Generation (SSG)
Exploring Server-side Rendering (SSR) with "getServerSideProps"
Working with Params for SSG Data Fetching
Preparing Paths with "getStaticPaths" & Working With Fallback Pages
Sending Http Requests To Our API Routes
Getting Data From The Database
Getting Meetup Details Data & Preparing Pages
Deploying Next.js Projects
Using Fallback Pages & Re-deploying
Animating with CSS Transitions
Animating with CSS Animations
Introducing Framer Motion
Framer Motion Basics & Fundamentals
Animating Between Conditional Values
Animating Element Disappearances / Removal
Making Elements "Pop" With Hover Animations
Nested Animations & Variants
Animating Staggered Lists
Animating Colors & Working with Keyframes
Orchestrating Multi-Element Animations
Combining Animations With Layout Animations
Animating Shared Elements
Re-triggering Animations via Keys
Installing & Using TypeScript
Working with Array & Object Types
Understanding Type Inference
Understanding Type Aliases
Functions & Function Types
A Closer Look At Generics
Creating a React + TypeScript Project
Working with Components & TypeScript
Working with Props & TypeScript
Time to Practice: Exercise Time!
Form Submissions In TypeScript Projects
Working with refs & useRef
Working with "Function Props"
Managing State & TypeScript
Time to Practice: Removing a Todo
The Context API & TypeScript
Bonus: Exploring tsconfig.json
What Is React & Why Would You Use It?
React Projects - Requirements
Understanding How React Works
Building A First Custom Component
Outputting Dynamic Values
Passing Data to Components with Props
CSS Styling & CSS Modules
Exercise & Another Component
Preparing the App For State Management
The Special "children" Prop
State & Conditional Content
Adding a Shared Header & More State Management
Updating State Based On Previous State
Adding a Backend to the React SPA
Sending a POST HTTP Request
Handling Side Effects with useEffect()
Understanding & Adding Routing
Working with Layout Routes
Refactoring Route Components & More Nesting
Data Fetching via loader()s
Submitting Data with action()s
About these [BONUS / OPTIONAL] sections
What Are Components? And Why Is React All About Them?
React Code Is Written In A "Declarative Way"!
Creating a new React Project
Analyzing a Standard React Project
Exercise: Working with JSX Code
Building a First Custom Component
Exercise: Building a First Component
Writing More Complex JSX Code
Outputting Dynamic Data & Working with Expressions in JSX
Time to Practice: React & Component Basics
Exercise: Passing Data via "props"
Alternative Ways of Passing & Receiving / Handling "props"
Adding "normal" JavaScript Logic to Components
Splitting Components Into Multiple Components
The Concept of "Composition" ("children props")
Exercise: Component Composition
Organizing Component Files
An Alternative Function Syntax
Learning Check: React Basics Components Props & JSX
Listening to Events & Working with Event Handlers
Exercise: Listening to Events
How Component Functions Are Executed
Exercise: Working with "State"
A Closer Look at the "useState" Hook
State can be updated in many ways!
Working with Multiple States
Using One State Instead (And What's Better)
Updating State That Depends On The Previous State
Exercise: Using State with Form Inputs
Exercise: Updating State Based On Older State
Alternative: Creating A Shared Handler Function
Time to Practice: Working with Events & State
Child-to-Parent Component Communication (Bottom-up)
Controlled vs Uncontrolled Components & Stateless vs Stateful Components
Learning Check: Working with Events & State
The First Practice Project & Your Tasks
Splitting the App Into Components
Outputting Results Conditionally
Introducing the Second Project
Adding a "User" Component
Adding a re-usable "Card" Component
Adding a re-usable "Button" Component
Managing the User Input State
Adding Validation & Resetting Logic
Adding a Users List Component
Managing a List Of Users via State
Adding The "ErrorModal" Component