MongoDB vs. PostgreSQL
• Data Model: MongoDB Utilizes flexible, schema-less documents organized in collections, whereas PostgreSQL employs fixed schemas with predefined tables, rows, and columns.
• Schema: MongoDB operates on a schema-on-read basis, allowing various structures within a single collection (ideal for quick prototyping), in contrast to PostgreSQL's schema-on-write that necessitates prior definition of structure.
• Relationships: MongoDB is managed through manual referencing (population) or embedded documents without foreign key constraints, compared to PostgreSQL's use of formal joins, primary/foreign keys, and REFERENCES to ensure data integrity.
• Query Language: MongoDB Employs MongoDB Query Language (MQL) with a JSON-like syntax, while PostgreSQL uses standard SQL suitable for complex analytics.
• ACID Compliance: MongoDB provides single-document ACID guarantees with multi-document transactions available (though less efficient), whereas PostgreSQL offers full ACID compliance out of the box, making it suitable for financial applications.
• Extensibility: MongoDB features basic aggregation pipelines with indexing options, but is more limited than PostgreSQL, which is highly extensible and supports various modules like PostGIS (for geospatial data) and TimescaleDB (for time-series data).
stay well, stay curious, and stay coding ✌️
• Data Model: MongoDB Utilizes flexible, schema-less documents organized in collections, whereas PostgreSQL employs fixed schemas with predefined tables, rows, and columns.
• Schema: MongoDB operates on a schema-on-read basis, allowing various structures within a single collection (ideal for quick prototyping), in contrast to PostgreSQL's schema-on-write that necessitates prior definition of structure.
• Relationships: MongoDB is managed through manual referencing (population) or embedded documents without foreign key constraints, compared to PostgreSQL's use of formal joins, primary/foreign keys, and REFERENCES to ensure data integrity.
• Query Language: MongoDB Employs MongoDB Query Language (MQL) with a JSON-like syntax, while PostgreSQL uses standard SQL suitable for complex analytics.
• ACID Compliance: MongoDB provides single-document ACID guarantees with multi-document transactions available (though less efficient), whereas PostgreSQL offers full ACID compliance out of the box, making it suitable for financial applications.
• Extensibility: MongoDB features basic aggregation pipelines with indexing options, but is more limited than PostgreSQL, which is highly extensible and supports various modules like PostGIS (for geospatial data) and TimescaleDB (for time-series data).
stay well, stay curious, and stay coding ✌️
❤1
🌟 Week 9 Day 2 — State, Events, Forms & Side Effects
Hello campers 💙
I hope you’re doing well and building cool things 😄
Today we'll learn:
useState
useRef
useMemo
Events
Conditional rendering
Rendering lists
Forms
useEffect
Fetching API data...
The Core Idea: React Changes When Data Changes
Remember:
If data changes → React updates the screen.
That changing data is usually called state.
➙ What is State?
State is information a component remembers.
Think of state like memory.
➤ useState Hook
React provides a hook called useState.
It gives a component memory.
Basic Syntax
Understanding It
const [count, setCount] = useState(0);
Think of it like:
➛count → current value
➛setCount → function to update it
➛0 → starting value
➤ Updating State
Each click updates state.
React re-renders automatically.
🤔 Why Not Just Variables?
This changes data but React won’t update UI.
Because React only tracks state, not ordinary variables.
📌 Immutability Principle
React strongly prefers immutable updates: instead of modifying an existing object or array, you create a new copy with the changes. This allows React to compare old and new state efficiently (shallow equality). Mutating state directly often leads to silent bugs because React may skip re‑rendering.
Bad
user.name = "John";
Good
setUser({ ...user, name: "John" });
➤ Event Handling
Events = user actions.
Events are user actions like clicks, typing, or hovering. React uses Synthetic Events – a cross‑browser wrapper around native browser events. Synthetic Events ensure consistent behavior across all browsers and provide the same API everywhere.
Examples:
➛click
➛typing
➛hover
➛submit
➢ onClick
Function
➢ onChange
Used mainly in forms.
➤ Synthetic Events
React wraps browser events in its own system.
Called Synthetic Events.
Why?
➛consistent behavior
➛cross-browser compatibility
➛Think of it as a translator between React and browser.
➤ Conditional Rendering
Conditional rendering means showing different UI depending on state or props. You have several tools:
· if / else – best for large blocks or early returns.
· Ternary operator (? :) – great inside JSX for simple conditions.
· Logical AND (&&) – perfect for “show this or nothing”.
if Statement
Ternary
&& Operator
Only shows if true.
Analogy
Conditional rendering = door access.
If you have permission → enter.
No permission → hidden.
➤ Rendering Lists
Rendering lists is about transforming an array of data into an array of JSX elements using Array.prototype.map(). React then renders each element.
Use .map().
key Prop
Required when rendering lists.
Why?
React tracks elements efficiently.
Key = ID card.
📝 Controlled Forms
In a controlled form, React state becomes the “single source of truth” for the input’s value. The input’s value attribute is bound to state, and the onChange handler updates that state. This creates a two‑way feedback loop: typing updates state, and state updates the input’s displayed value.
Example
How It Works
➛Typing updates state.
➛State updates input.
➛Circular connection.
Analogy
Like steering wheel + wheels.
Move one → other responds.
Form Submission
Why preventDefault?
Normally forms reload page.
React apps usually avoid that.
Hello campers 💙
I hope you’re doing well and building cool things 😄
Today we'll learn:
useState
useRef
useMemo
Events
Conditional rendering
Rendering lists
Forms
useEffect
Fetching API data...
The Core Idea: React Changes When Data Changes
Remember:
If data changes → React updates the screen.
That changing data is usually called state.
➙ What is State?
State is information a component remembers.
Think of state like memory.
➤ useState Hook
React provides a hook called useState.
It gives a component memory.
Basic Syntax
import { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return <h1>{count}</h1>; }
Understanding It
const [count, setCount] = useState(0);
Think of it like:
➛count → current value
➛setCount → function to update it
➛0 → starting value
➤ Updating State
<button onClick={() => setCount(count + 1)}> Increase </button>
Each click updates state.
React re-renders automatically.
🤔 Why Not Just Variables?
let count = 0; count++;
This changes data but React won’t update UI.
Because React only tracks state, not ordinary variables.
📌 Immutability Principle
React strongly prefers immutable updates: instead of modifying an existing object or array, you create a new copy with the changes. This allows React to compare old and new state efficiently (shallow equality). Mutating state directly often leads to silent bugs because React may skip re‑rendering.
Bad
user.name = "John";
Good
setUser({ ...user, name: "John" });
➤ Event Handling
Events = user actions.
Events are user actions like clicks, typing, or hovering. React uses Synthetic Events – a cross‑browser wrapper around native browser events. Synthetic Events ensure consistent behavior across all browsers and provide the same API everywhere.
Examples:
➛click
➛typing
➛hover
➛submit
➢ onClick
<button onClick={handleClick}>Click</button>
Function
function handleClick() { console.log("Clicked"); }
➢ onChange
Used mainly in forms.
<input onChange={handleChange} />
➤ Synthetic Events
React wraps browser events in its own system.
Called Synthetic Events.
Why?
➛consistent behavior
➛cross-browser compatibility
➛Think of it as a translator between React and browser.
➤ Conditional Rendering
Conditional rendering means showing different UI depending on state or props. You have several tools:
· if / else – best for large blocks or early returns.
· Ternary operator (? :) – great inside JSX for simple conditions.
· Logical AND (&&) – perfect for “show this or nothing”.
if Statement
if (loggedIn) { return <h1>Welcome</h1>; }
Ternary
<h1>{loggedIn ? "Welcome" : "Login"}</h1>
&& Operator
{isAdmin && <button>Delete</button>}
Only shows if true.
Analogy
Conditional rendering = door access.
If you have permission → enter.
No permission → hidden.
➤ Rendering Lists
Rendering lists is about transforming an array of data into an array of JSX elements using Array.prototype.map(). React then renders each element.
Use .map().
const users = ["Anna", "John", "Sara"];
return ( <div> {users.map((user) => ( <p>{user}</p> ))} </div> );
key Prop
Required when rendering lists.
{users.map((user, index) => ( <p key={index}>{user}</p> ))}
Why?
React tracks elements efficiently.
Key = ID card.
📝 Controlled Forms
In a controlled form, React state becomes the “single source of truth” for the input’s value. The input’s value attribute is bound to state, and the onChange handler updates that state. This creates a two‑way feedback loop: typing updates state, and state updates the input’s displayed value.
Example
const [name, setName] = useState("");
<input value={name} onChange={(e) => setName(e.target.value)} />
How It Works
➛Typing updates state.
➛State updates input.
➛Circular connection.
Analogy
Like steering wheel + wheels.
Move one → other responds.
Form Submission
function handleSubmit(e) { e.preventDefault();
console.log(name); }
Why preventDefault?
Normally forms reload page.
React apps usually avoid that.
➤ useEffect
useEffect handles side effects – operations that interact with the outside world or that React cannot manage during rendering. Examples: fetching data, reading localStorage, setting timers, or manually changing the DOM.
useEffect takes two arguments: a function (the effect) and a dependency array. The effect runs after the component renders (or commits to the screen). The dependency array tells React when to re‑run the effect:
Basic Syntax
Dependency Array
➛Empty
[]
Runs once.
➛With dependency
[count]
Runs when count changes.
➛No dependency
Runs every render.
Analogy
Dependency array = trigger list.
Like security sensors.
Only activates when chosen values change.
➛Cleanup Function
Used when component leaves.
Why?
Prevent memory leaks.
➤ Fetching API Data
Fetching data is a classic side effect, so it belongs inside useEffect (usually with an empty dependency array to run once on mount). While fetching, you typically manage three states: data, loading, and error. This pattern gives users feedback and handles failures gracefully.
Axios Version
Install:
Usage
➤ useRef
useRef creates a mutable object with a .current property. Unlike state, changing .current does not trigger a re‑render. This makes useRef ideal for:
· Accessing DOM nodes directly (e.g., focusing an input, measuring size).
· Storing values that persist across renders but shouldn’t cause re‑renders (e.g., interval IDs, previous values).
Access DOM
Analogy
useRef = sticky note.
Stores info quietly.
No UI update.
➤ useMemo
useMemo caches the result of a computation. It only recomputes when one of its dependencies changes. Use it for expensive calculations (e.g., filtering large arrays, complex math) to avoid doing unnecessary work on every render.
Why?
Avoid unnecessary recalculation.
Analogy
Like saving previous math answer.
No need to solve again.
useEffect handles side effects – operations that interact with the outside world or that React cannot manage during rendering. Examples: fetching data, reading localStorage, setting timers, or manually changing the DOM.
useEffect takes two arguments: a function (the effect) and a dependency array. The effect runs after the component renders (or commits to the screen). The dependency array tells React when to re‑run the effect:
Basic Syntax
useEffect(() => { console.log("Mounted"); }, []);
Dependency Array
➛Empty
[]
Runs once.
➛With dependency
[count]
Runs when count changes.
➛No dependency
Runs every render.
Analogy
Dependency array = trigger list.
Like security sensors.
Only activates when chosen values change.
➛Cleanup Function
Used when component leaves.
useEffect(() => {
const timer = setInterval(() => {
console.log("Running"); }, 1000);
return () => { clearInterval(timer); }; }, []);
Why?
Prevent memory leaks.
➤ Fetching API Data
Fetching data is a classic side effect, so it belongs inside useEffect (usually with an empty dependency array to run once on mount). While fetching, you typically manage three states: data, loading, and error. This pattern gives users feedback and handles failures gracefully.
useEffect(() => { fetch("https://jsonplaceholder.typicode.com/users")
.then(res => res.json())
.then(data => console.log(data)); }, []); Axios Version
Install:
npm install axios
Usage
import axios from "axios";
useEffect(() => {
axios.get("https://jsonplaceholder.typicode.com/users")
.then(res => console.log(res.data)); }, []); ➤ useRef
useRef creates a mutable object with a .current property. Unlike state, changing .current does not trigger a re‑render. This makes useRef ideal for:
· Accessing DOM nodes directly (e.g., focusing an input, measuring size).
· Storing values that persist across renders but shouldn’t cause re‑renders (e.g., interval IDs, previous values).
const inputRef = useRef();
Access DOM
<input ref={inputRef} />
<button onClick={() => inputRef.current.focus()}> Focus </button>
Analogy
useRef = sticky note.
Stores info quietly.
No UI update.
➤ useMemo
useMemo caches the result of a computation. It only recomputes when one of its dependencies changes. Use it for expensive calculations (e.g., filtering large arrays, complex math) to avoid doing unnecessary work on every render.
const result = useMemo(() => {
return heavyCalculation(data); }, [data
]);
Why?
Avoid unnecessary recalculation.
Analogy
Like saving previous math answer.
No need to solve again.
🧩 Week 9 Day 2 Challenges
Challenge 1: Student Registration App
➢Build a small app where users can register students.
Requirements:
➛Create a form with:
name
age
course
➛Use useState for all inputs
On submit:
➢prevent page refresh
➢add student to a displayed list
➢Use .map() to render all students
➢Show total students registered
➢Add conditional message:
➢if no students → show "No students yet"
Challenge 2: Product Search Dashboard
Build a product list dashboard.
Requirements:
➛Create an array of at least 8 products
➛Render them using .map()
➛Add search input
➛Use onChange to filter products by name
➛Use conditional rendering:
➛if no product matches → show "No products found"
➛Use useMemo to optimize filtered results
➛Add a button that focuses search input using useRef
Challenge 3: User Fetch + Profile Viewer
Build a user viewer app.
Requirements:
➛Fetch users from: https://jsonplaceholder.typicode.com/users
➛Use useEffect
➛Display:
name
email
company
➛Add loading state
Add button:
➤show/hide users
➤Add input field to search users by name
➤Use conditional rendering
➤Add cleanup function inside useEffect
➤Use keys properly when rendering list
When you are done,
💥 Share your solutions,
💥 invite a friend,
and as always —
💥 stay well, stay curious, and stay coding ✌️
Challenge 1: Student Registration App
➢Build a small app where users can register students.
Requirements:
➛Create a form with:
name
age
course
➛Use useState for all inputs
On submit:
➢prevent page refresh
➢add student to a displayed list
➢Use .map() to render all students
➢Show total students registered
➢Add conditional message:
➢if no students → show "No students yet"
Challenge 2: Product Search Dashboard
Build a product list dashboard.
Requirements:
➛Create an array of at least 8 products
➛Render them using .map()
➛Add search input
➛Use onChange to filter products by name
➛Use conditional rendering:
➛if no product matches → show "No products found"
➛Use useMemo to optimize filtered results
➛Add a button that focuses search input using useRef
Challenge 3: User Fetch + Profile Viewer
Build a user viewer app.
Requirements:
➛Fetch users from: https://jsonplaceholder.typicode.com/users
➛Use useEffect
➛Display:
name
company
➛Add loading state
Add button:
➤show/hide users
➤Add input field to search users by name
➤Use conditional rendering
➤Add cleanup function inside useEffect
➤Use keys properly when rendering list
When you are done,
💥 Share your solutions,
💥 invite a friend,
and as always —
💥 stay well, stay curious, and stay coding ✌️
❤2
Forwarded from Bytephilosopher
Today I had a meeting with a senior Google developer who has worked there for more than 20 years, both as a permanent employee and freelancer. It was such an amazing experience, and I got a lot of valuable insights from him.
Here are some life principles and lessons I learned:
1. Stay fit and take care of your health. At the end of the day, health matters the most.
2. Focus on building real skills first. Don’t just follow whatever trend the world is chasing. Work on something you truly enjoy, something you can spend hours on like it’s a game. Read books, especially research papers. If you are a junior developer, learn the fundamentals deeply. Use AI wisely to understand things from the ground level.
3. Communication skills are just as important as technical skills. Learn how to explain and present your knowledge. These days, your online presence matters a lot more than just a resume. Build visibility through platforms like GitHub and by sharing your work online.
Also, attend workshops and meetups. But don’t just attend. make sure you connect with at least one person and keep in touch with them.
4. Have a spiritual life. Whether you are religious or not, always try to be good to others. You never know when your kindness will come back to help you.
Another important point was this:
Build projects that solve your own problems or local problems around you. It’s easier to understand problems you personally face. Then think about how those solutions can scale internationally.
And about AI:
Use AI as a mentor, not as something to completely depend on. Learn the basics well and use AI to simplify your learning and productivity.
Finally, being a good developer means being a lifelong learner. Technology changes fast, and you must keep updating yourself. He started learning during the COBOL and FORTRAN era, and he still adapts to modern technologies today. So keep learning, keep building, and prepare yourself for the international market.
Visibility matters. Real projects matter. Continuous learning matters.
@byte_philosopher
Here are some life principles and lessons I learned:
1. Stay fit and take care of your health. At the end of the day, health matters the most.
2. Focus on building real skills first. Don’t just follow whatever trend the world is chasing. Work on something you truly enjoy, something you can spend hours on like it’s a game. Read books, especially research papers. If you are a junior developer, learn the fundamentals deeply. Use AI wisely to understand things from the ground level.
3. Communication skills are just as important as technical skills. Learn how to explain and present your knowledge. These days, your online presence matters a lot more than just a resume. Build visibility through platforms like GitHub and by sharing your work online.
Also, attend workshops and meetups. But don’t just attend. make sure you connect with at least one person and keep in touch with them.
4. Have a spiritual life. Whether you are religious or not, always try to be good to others. You never know when your kindness will come back to help you.
Another important point was this:
Build projects that solve your own problems or local problems around you. It’s easier to understand problems you personally face. Then think about how those solutions can scale internationally.
And about AI:
Use AI as a mentor, not as something to completely depend on. Learn the basics well and use AI to simplify your learning and productivity.
Finally, being a good developer means being a lifelong learner. Technology changes fast, and you must keep updating yourself. He started learning during the COBOL and FORTRAN era, and he still adapts to modern technologies today. So keep learning, keep building, and prepare yourself for the international market.
Visibility matters. Real projects matter. Continuous learning matters.
@byte_philosopher
❤2👍2
Full Stack Camp
Photo
CommonJS Vs ES Modules
JavaScript has two main module systems: CommonJS and ES Modules.
CommonJS is the older system, built for Node.js. It uses
ES Modules are the newer, official standard for JavaScript. They work in both modern browsers and Node.js (with
The big difference between them is where and how they run. CommonJS is synchronous and works out of the box in Node, while ES Modules are asynchronous and work in both browsers and Node with a little setup. CommonJS uses
stay well, stay curious, and stay coding ✌️
JavaScript has two main module systems: CommonJS and ES Modules.
CommonJS is the older system, built for Node.js. It uses
require() to load a module and module.exports to share code. When you write const fs = require('fs'), Node reads the file right away, line by line. This is synchronous, meaning it waits for each module to load before moving to the next line. CommonJS works well on the server because files are on your local disk and load quickly. Many old Node projects still use it, and you don't need any special settings.ES Modules are the newer, official standard for JavaScript. They work in both modern browsers and Node.js (with
"type": "module" in package.json or using .mjs files). Instead of require(), you write import { something } from './file.js' and export your code. ES Modules load asynchronously, so they can fetch multiple files at once without blocking. This makes them better for web pages and large applications. They also allow tools to remove unused code, a feature called tree shaking, which keeps your final bundle small.The big difference between them is where and how they run. CommonJS is synchronous and works out of the box in Node, while ES Modules are asynchronous and work in both browsers and Node with a little setup. CommonJS uses
require() and module.exports; ES Modules use import and export. For new projects, ES Modules are the better choice because they follow the standard and will work everywhere. But you still see CommonJS everywhere, especially in older Node code and many npm packages.stay well, stay curious, and stay coding ✌️
👍3
Week 9 Day 3 — Component Composition & Routing
Hello campers ❤
Today we’ll learn how React applications are organized like real systems.
React applications are built from small reusable pieces connected together.
Part 1 — Component Composition
Component Composition
Composition means combining smaller components to build larger UI structures. You split your UI into pieces like <Navbar />, <Card />, <Button /> and then nest them inside each other. For example:
This keeps code clean, reusable, and easy to scale — just like building with LEGO blocks.
❌ Beginner Mistake
Putting everything inside one huge component (e.g., 500 lines in App) makes it messy, hard to debug, and impossible to reuse.
✅ Better Approach
Break UI into pieces, each with one responsibility:
App
├── Navbar
├── Sidebar
├── Feed
└── Footer
Thinking in Components
Before coding, ask “What parts repeat?” Those become reusable components. Example: instead of writing <h2>John</h2><h2>Sarah</h2> twice, create:
This prevents duplication and makes your app modular and predictable.
➜Why Composition Matters
Because real apps grow. Composition gives you readability, maintainability, scalability, and reusability.
➜ Shared State Problem
Two sibling components (like SearchBar and ProductList) often need the same data but can’t talk directly. Without a solution, updating SearchBar won’t filter ProductList.
Example:
➜ Lifting State Up
Move shared state to the closest common parent (here, App). Parent holds useState, passes data and setter functions down via props.
Now SearchBar calls setSearch and ProductList reads search — single source of truth, both stay synced. Analogy: one shared fridge instead of each person having fake copies.
➜ props.children
A special prop that lets you pass JSX content inside a component’s tags. Inside the wrapper, you render {props.children}. Example:
This makes wrapper components reusable for any inner content.
➢ Part 2 — Routing
➡Routing
Routing determines which component to show for a specific URL. You define routes like /home → Home component, /about → About. Without routing, your React app is just one page; routing turns it into a multi‑page experience without full reloads.
➡ React Router DOM
The standard library for routing in React. Install with:
Then wrap your app with <BrowserRouter> in main.jsx so React can track URLs. React itself has no built‑in routing — this library fills that gap.
React Router DOM v6 – main tools
🔹 BrowserRouter – Wraps your entire app to enable routing.
🔹 Routes & Route – Define which component renders for which path.
🔹 Link – Navigation without page reload (replaces <a>).
Regular <a> refreshes the whole page and loses state — Link keeps your app fast.
🔹 NavLink – Same as Link but adds active styling automatically.
Perfect for navigation bars where the current page should look different.
Hello campers ❤
Today we’ll learn how React applications are organized like real systems.
React applications are built from small reusable pieces connected together.
Part 1 — Component Composition
Component Composition
Composition means combining smaller components to build larger UI structures. You split your UI into pieces like <Navbar />, <Card />, <Button /> and then nest them inside each other. For example:
function Dashboard() {
return (
<div>
<Sidebar />
<MainContent />
</div>
);
}
This keeps code clean, reusable, and easy to scale — just like building with LEGO blocks.
❌ Beginner Mistake
Putting everything inside one huge component (e.g., 500 lines in App) makes it messy, hard to debug, and impossible to reuse.
✅ Better Approach
Break UI into pieces, each with one responsibility:
App
├── Navbar
├── Sidebar
├── Feed
└── Footer
Thinking in Components
Before coding, ask “What parts repeat?” Those become reusable components. Example: instead of writing <h2>John</h2><h2>Sarah</h2> twice, create:
function UserCard({ name }) {
return <h2>{name}</h2>;
}
// Then reuse:
<UserCard name="John" />
<UserCard name="Sarah" />
This prevents duplication and makes your app modular and predictable.
➜Why Composition Matters
Because real apps grow. Composition gives you readability, maintainability, scalability, and reusability.
➜ Shared State Problem
Two sibling components (like SearchBar and ProductList) often need the same data but can’t talk directly. Without a solution, updating SearchBar won’t filter ProductList.
Example:
<SearchBar /> {/* wants to update search term */}
<ProductList /> {/* wants to read search term */}➜ Lifting State Up
Move shared state to the closest common parent (here, App). Parent holds useState, passes data and setter functions down via props.
function App() {
const [search, setSearch] = useState("");
return (
<>
<SearchBar search={search} setSearch={setSearch} />
<ProductList search={search} />
</>
);
}Now SearchBar calls setSearch and ProductList reads search — single source of truth, both stay synced. Analogy: one shared fridge instead of each person having fake copies.
➜ props.children
A special prop that lets you pass JSX content inside a component’s tags. Inside the wrapper, you render {props.children}. Example:
function Card(props) {
return <div className="card">{props.children}</div>;
}
// Usage – different content, same wrapper:
<Card><h1>Hello</h1></Card>
<Card><button>Buy</button></Card>This makes wrapper components reusable for any inner content.
➢ Part 2 — Routing
➡Routing
Routing determines which component to show for a specific URL. You define routes like /home → Home component, /about → About. Without routing, your React app is just one page; routing turns it into a multi‑page experience without full reloads.
➡ React Router DOM
The standard library for routing in React. Install with:
npm install react-router-dom
Then wrap your app with <BrowserRouter> in main.jsx so React can track URLs. React itself has no built‑in routing — this library fills that gap.
React Router DOM v6 – main tools
🔹 BrowserRouter – Wraps your entire app to enable routing.
import { BrowserRouter } from "react-router-dom";
<BrowserRouter><App /></BrowserRouter>🔹 Routes & Route – Define which component renders for which path.
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
🔹 Link – Navigation without page reload (replaces <a>).
<Link to="/about">About</Link>
Regular <a> refreshes the whole page and loses state — Link keeps your app fast.
🔹 NavLink – Same as Link but adds active styling automatically.
<NavLink to="/about" className={({ isActive }) => isActive ? "active" : ""}>
About
</NavLink>Perfect for navigation bars where the current page should look different.
➡ Dynamic Routes
Routes that capture variable parts of the URL, like /users/1, /users/42.
Define with a colon:
Inside the User component, use useParams to grab the id:
This lets you show different user profiles using the same component.
➡ useNavigate
A hook to change routes programmatically from JavaScript.
Useful after form submissions, logins, or any action where you need to redirect without a link click.
➜Mental Model of Routing
React Router watches the URL. When it changes, it renders the matching component — no full page refresh. It feels instant.
Real App Structure
Pages are entire views that match a route; components are smaller pieces reused across pages. This keeps your project clean and easy to navigate.
Routes that capture variable parts of the URL, like /users/1, /users/42.
Define with a colon:
<Route path="/users/:id" element={<User />} />Inside the User component, use useParams to grab the id:
import { useParams } from "react-router-dom";
function User() {
const { id } = useParams();
return <h1>User ID: {id}</h1>;
}This lets you show different user profiles using the same component.
➡ useNavigate
A hook to change routes programmatically from JavaScript.
const navigate = useNavigate();
// After login:
navigate("/dashboard");
// Or go back:
navigate(-1);
Useful after form submissions, logins, or any action where you need to redirect without a link click.
➜Mental Model of Routing
React Router watches the URL. When it changes, it renders the matching component — no full page refresh. It feels instant.
Real App Structure
src/
├── components/ # reusable: Button, Card, Navbar
├── pages/ # full screens: Home, About, Profile
├── App.jsx
└── main.jsxPages are entire views that match a route; components are smaller pieces reused across pages. This keeps your project clean and easy to navigate.
🧩 Week 9 Day 3 Challenges
Challenge 1: Movie Explorer App
Build a small multi-page movie app.
Requirements:
➜Create pages:
Home
Movies
MovieDetails
➜Use React Router DOM
➜Add navigation using Link or NavLink
➜Store movie data in an array or fetch from an API
➜Render movie cards using .map()
Clicking a movie should navigate to:
/movies/:id
➜Use useParams to display selected movie details
➜Create a reusable Card component using props.children
Challenge 2: Travel Destination Planner
Build a travel destinations app.
Requirements:
➜Create components:
Navbar
DestinationList
DestinationDetails
➜Use routing for pages
➜Add at least 5 destinations
➜Clicking a destination opens:
/destinations/:id
➜Use useNavigate for a “Go Back” button
➜Lift state up to parent component for selected region filtering
➜Use props.children for reusable layout wrappers
Challenge 3: Music Artist Dashboard
Build a music artist dashboard.
Requirements:
➜Create pages:
Home
Artists
ArtistProfile
➜Use dynamic routes:
/artists/:id
➜Display:
artist name
genre
albums
➜Use .map() to render artist list
➜Use useParams for profile page
➜Add active navigation styling using NavLink
➜Create reusable Section wrapper component using props.children
Lift search state up so multiple components can access filtered artists
When you are done,
💥 Share your solutions,
💥 invite a friend,
and as always —
💥 stay well, stay curious, and stay coding ✌️
Challenge 1: Movie Explorer App
Build a small multi-page movie app.
Requirements:
➜Create pages:
Home
Movies
MovieDetails
➜Use React Router DOM
➜Add navigation using Link or NavLink
➜Store movie data in an array or fetch from an API
➜Render movie cards using .map()
Clicking a movie should navigate to:
/movies/:id
➜Use useParams to display selected movie details
➜Create a reusable Card component using props.children
Challenge 2: Travel Destination Planner
Build a travel destinations app.
Requirements:
➜Create components:
Navbar
DestinationList
DestinationDetails
➜Use routing for pages
➜Add at least 5 destinations
➜Clicking a destination opens:
/destinations/:id
➜Use useNavigate for a “Go Back” button
➜Lift state up to parent component for selected region filtering
➜Use props.children for reusable layout wrappers
Challenge 3: Music Artist Dashboard
Build a music artist dashboard.
Requirements:
➜Create pages:
Home
Artists
ArtistProfile
➜Use dynamic routes:
/artists/:id
➜Display:
artist name
genre
albums
➜Use .map() to render artist list
➜Use useParams for profile page
➜Add active navigation styling using NavLink
➜Create reusable Section wrapper component using props.children
Lift search state up so multiple components can access filtered artists
When you are done,
💥 Share your solutions,
💥 invite a friend,
and as always —
💥 stay well, stay curious, and stay coding ✌️