Best ReactJS Intermediate Level Explanation
Best ReactJS Intermediate Level Explanation
useEffect
1. useEffect kya hai?
useEffect = hook for side effects
Examples:
Logging
2. Syntax
useEffect(() => {
// side effect code here
return () => {
// cleanup code here (optional)
};
}, [dependencies]);
ReactJs Intermediate 1
Dependencies array → effect kab run hoga
function Hello() {
useEffect(() => {
console.log("Component mounted"); // runs once
}, []); // empty array = run only once
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log("Count changed:", count);
}, [count]); // run whenever count changes
5. Cleanup Function
ReactJs Intermediate 2
Necessary for subscriptions, timers, event listeners
useEffect(() => {
const timer = setInterval(() => {
console.log("Tick");
}, 1000);
return () => {
clearInterval(timer); // cleanup
console.log("Timer cleared");
};
}, []);
function Users() {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users")
.then((res) => res.json())
.then((data) => {
setUsers(data);
setLoading(false);
})
.catch((err) => console.log(err));
}, []); // run once
ReactJs Intermediate 3
return (
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}
7. Common Patterns
1. ComponentDidMount: useEffect(() => {...}, [])
8. MeriAnalogy
Socho: component = kitchen
9. Key Takeaways
1. useEffect = side effects handler in functional components
ReactJs Intermediate 4
3. Cleanup is mandatory for timers, subscriptions
useRef
1. useRef kya hai?
useRef = hook jo mutable reference create karta hai
2. Syntax
function FocusInput() {
const inputRef = useRef(null);
ReactJs Intermediate 5
const handleClick = () => {
inputRef.current.focus(); // DOM element pe directly kaam
};
return (
<div>
<input ref={inputRef} type="text" placeholder="Type here..." />
<button onClick={handleClick}>Focus Input</button>
</div>
);
}
function Timer() {
const [count, setCount] = useState(0);
const intervalRef = useRef(null);
return (
<div>
<p>Count: {count}</p>
<button onClick={start}>Start</button>
ReactJs Intermediate 6
<button onClick={stop}>Stop</button>
</div>
);
}
function PrevCounter() {
const [count, setCount] = useState(0);
const prevCountRef = useRef(0);
useEffect(() => {
prevCountRef.current = count; // update previous value after render
}, [count]);
return (
<div>
<p>Current: {count}</p>
<p>Previous: {prevCountRef.current}</p>
ReactJs Intermediate 7
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
7. Meri Analogy
Soch useState = TV ka display → har change → screen update
8. Key Takeaways
1. useRef = mutable reference in functional components
2. Main uses:
ReactJs Intermediate 8
React me functional components har render me poora function run karte
hain
Syntax:
[a, b] → dependencies
function HeavyCalc() {
const [count, setCount] = useState(0);
const [other, setOther] = useState(0);
ReactJs Intermediate 9
return (
<div>
<p>Factorial of {count} is {fact}</p>
<button onClick={() => setCount(count + 1)}>Increment Count</button>
<button onClick={() => setOther(other + 1)}>Increment Other</button>
</div>
);
}
Console log check → factorial sirf count change pe calculate hota hai,
other change pe nahi
ReactJs Intermediate 10
function Parent() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment Count</button>
<Child onClick={handleClick} />
</div>
);
}
4. Meri Analogy
Socho: component = factory
useMemo = “bhai, agar raw materials same hai → previous product use kar
lo, dobara mat banayo”
5. Key Takeaways
1. useMemo → memoize values / heavy calculations
ReactJs Intermediate 11
4. Use in performance-critical apps
Forms
1. Forms ka funda
Forms = user input lene ka tarika
2. Controlled Components
Input ka value React state se control hota hai
function NameForm() {
const [name, setName] = useState("");
ReactJs Intermediate 12
return (
<form onSubmit={handleSubmit}>
<input type="text" value={name} onChange={handleChange} />
<button type="submit">Submit</button>
</form>
);
}
Flow:
3. Multiple Inputs
function MultiForm() {
const [form, setForm] = useState({ email: "", password: "" });
return (
<form onSubmit={handleSubmit}>
<input name="email" value={form.email} onChange={handleChange} pl
aceholder="Email" />
<input name="password" value={form.password} onChange={handleC
hange} placeholder="Password" />
<button type="submit">Submit</button>
</form>
);
}
ReactJs Intermediate 13
Dynamic form handling using name attribute
function Preferences() {
const [checked, setChecked] = useState(false);
return (
<div>
<label>
<inputtype="checkbox"
checked={checked}
onChange={(e) => setChecked(e.target.checked)}
/>
Accept Terms
</label>
<p>{checked ? "Accepted" : "Not Accepted"}</p>
</div>
);
}
5. Select Dropdown
function SelectForm() {
const [fruit, setFruit] = useState("");
return (
<div>
<select value={fruit} onChange={(e) => setFruit(e.target.value)}>
<option value="">Select Fruit</option>
<option value="apple">Apple</option>
<option value="mango">Mango</option>
ReactJs Intermediate 14
</select>
<p>Selected: {fruit}</p>
</div>
);
}
function UncontrolledForm() {
const inputRef = useRef();
return (
<form onSubmit={handleSubmit}>
<input type="text" ref={inputRef} />
<button type="submit">Submit</button>
</form>
);
}
Less React control → simpler but not recommended for complex forms
7. Meri Analogy
Socho: form = kitchen order slip
ReactJs Intermediate 15
Controlled → React chef knows exactly kya ingredients user ne choose
kiya, har change track karta hai
Uncontrolled → chef bas slip dekhke kaam karta hai, React ko pata nahi →
inefficient
8. Key Takeaways
1. Forms handle karne ka React way → controlled components
function ControlledInput() {
const [name, setName] = useState("");
ReactJs Intermediate 16
return (
<div>
<inputtype="text"
value={name} // controlled by React state
onChange={(e) => setName(e.target.value)} // update state
placeholder="Enter name"
/>
<p>Hello, {name}</p>
</div>
);
}
Flow:
Pros:
Validation easy
Predictable
Cons:
2. Uncontrolled Components
Uncontrolled = DOM itself manages value
function UncontrolledInput() {
ReactJs Intermediate 17
const inputRef = useRef();
return (
<div>
<input type="text" ref={inputRef} placeholder="Enter name" />
<button onClick={handleSubmit}>Submit</button>
</div>
);
}
Flow:
Pros:
Cons:
3. Key Differences
Feature Controlled Uncontrolled
ReactJs Intermediate 18
Feature Controlled Uncontrolled
4. Meri Analogy
Controlled = React chef knows exact ingredients user ne choose kiye →
can adjust anytime
Uncontrolled = Chef bas slip dekhe → kaam karta hai → React unaware of
changes
5. Best Practice
Always prefer controlled components for real-world apps
Example:
function App() {
const user = "Harsh";
return <Parent user={user} />;
}
ReactJs Intermediate 19
}
No props drilling
Steps:
1. Create Context
1. Provide Context
function App() {
const user = "Harsh";
return (
<UserContext.Provider value={user}>
<Parent />
</UserContext.Provider>
);
ReactJs Intermediate 20
}
1. Consume Context
function GrandChild() {
const user = useContext(UserContext);
return <p>Hello {user}</p>;
}
function App() {
const [user, setUser] = React.useState("Harsh");
return (
<UserContext.Provider value={{ user, setUser }}>
<Parent />
</UserContext.Provider>
);
}
function GrandChild() {
const { user, setUser } = useContext(UserContext);
return (
<div>
<p>Hello {user}</p>
<button onClick={() => setUser("Shweta")}>Change User</button>
</div>
ReactJs Intermediate 21
);
}
4. Meri Analogy
Socho: props drilling = bucket brigade
5. Key Takeaways
1. Props drilling → inefficient, messy for deep trees
Router
1. React Router kya hai?
React SPA me ek hi HTML page hota hai
ReactJs Intermediate 22
Browser URL change hota hai → React DOM ke andar component switch
hota hai
2. Installation
3. Basic Setup
import { BrowserRouter as Router, Routes, Route, Link } from "react-router-
dom";
function App() {
return (
<Router>
<nav>
<Link to="/">Home</Link> |
<Link to="/about">About</Link> |
<Link to="/contact">Contact</Link>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/contact" element={<Contact />} />
</Routes>
ReactJs Intermediate 23
</Router>
);
}
Explanation:
function User({ id }) {
return <h1>User ID: {id}</h1>;
}
// Setup
<Route path="/user/:id" element={<UserWrapper />} />
function UserWrapper() {
const { id } = useParams(); // hook to get URL param
return <User id={id} />;
}
5. Nested Routes
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<Outlet /> {/* nested component render here */}
</div>
ReactJs Intermediate 24
);
}
<Routes>
<Route path="/dashboard" element={<Dashboard />}>
<Route path="stats" element={<Stats />} />
<Route path="reports" element={<Reports />} />
</Route>
</Routes>
6. Redirect / Navigation
function Login() {
const navigate = useNavigate();
ReactJs Intermediate 25
<Route path="*" element={<h1>404 Not Found</h1>} />
8. Meri Analogy
React app = city
9. Key Takeaways
1. React Router = SPA navigation engine
2. Components:
ReactJs Intermediate 26
Single Page Apps (SPA)
1. SPA kya hai?
SPA = Single Page Application
User navigate kare → browser reload nahi hota, sirf content dynamically
update hota hai
Page reload Full reload on every navigation No reload, just DOM update
3. SPA ka Flow
1. Browser loads index.html once
Flow diagram:
ReactJs Intermediate 27
Browser -> index.html -> React App -> Routes -> Component -> API (if need
ed) -> Render
4. React + SPA
React naturally SPA friendly hai
5. SPA Benefits
1. Fast Navigation → no full reload
6. SPA Challenges
SEO → server-side rendering needed for bots → solution: Next.js
7. Meri Analogy
MPA = old-school office → har file open → desk reset → slow
React = control room operator → decide which section show without desk
reset
ReactJs Intermediate 28
8. Key Takeaways
1. SPA = single HTML page + multiple dynamic views
Browser URL match hota hai → React component render hota hai
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Router>
);
}
ReactJs Intermediate 29
Route = single URL → component map
3. Dynamic Routes
Dynamic route = URL me variable part
function User() {
const { id } = useParams(); // grab dynamic part
return <h1>User ID: {id}</h1>;
}
// Route
<Route path="/user/:id" element={<User />} />
3. Nested Routes
Nested = child component inside parent route
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<nav>
<Link to="stats">Stats</Link> | <Link to="reports">Reports</Link>
ReactJs Intermediate 30
</nav>
<Outlet /> {/* child render */}
</div>
);
}
<Routes>
<Route path="/dashboard" element={<Dashboard />}>
<Route path="stats" element={<Stats />} />
<Route path="reports" element={<Reports />} />
</Route>
</Routes>
4. Meri Analogy
Routes = city map → URL decide karta hai kaunsa building open hoga
5. Key Takeaways
1. Route = URL → component mapping
ReactJs Intermediate 31
6. Use Link for SPA navigation → no reload
Fetching API’S
1. API Fetching kya hai?
API = Application Programming Interface → backend se data lene ka tarika
function Users() {
const [users, setUsers] = useState([]);
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users")
.then((res) => res.json())
.then((data) => setUsers(data))
.catch((err) => console.log(err));
}, []); // empty deps → run once on mount
return (
<div>
<h1>Users List</h1>
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
ReactJs Intermediate 32
</ul>
</div>
);
}
Flow:
3. Async/Await Version
useEffect(() => {
const fetchUsers = async () => {
try {
const res = await fetch("https://jsonplaceholder.typicode.com/users");
const data = await res.json();
setUsers(data);
} catch (err) {
console.log(err);
}
};
fetchUsers();
}, []);
useEffect(() => {
ReactJs Intermediate 33
const fetchUsers = async () => {
try {
const res = await fetch("https://jsonplaceholder.typicode.com/users");
if (!res.ok) throw new Error("Network error");
const data = await res.json();
setUsers(data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
fetchUsers();
}, []);
useEffect(() => {
const fetchUsers = async () => {
try {
const res = await axios.get("https://jsonplaceholder.typicode.com/user
s");
setUsers(res.data);
} catch (err) {
console.log(err);
}
ReactJs Intermediate 34
};
fetchUsers();
}, []);
6. Meri Analogy
API call = wait staff in restaurant
7. Key Takeaways
1. useEffect → component mount / dependency change pe API call
Returns Promise
Syntax:
ReactJs Intermediate 35
fetch("https://jsonplaceholder.typicode.com/users")
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.log(err));
Pros:
Built-in, lightweight
No extra dependency
Cons:
No request/response interceptors
2. Axios
Third-party library → npm install axios
axios.get("https://jsonplaceholder.typicode.com/users")
.then(res => console.log(res.data))
.catch(err => console.log(err));
Pros:
Cleaner syntax
Cons:
ReactJs Intermediate 36
Extra dependency
3. Async/Await Example
Fetch
try {
const res = await fetch("https://jsonplaceholder.typicode.com/users");
if (!res.ok) throw new Error("Network Error");
const data = await res.json();
console.log(data);
} catch (err) {
console.log(err);
}
Axios
try {
const res = await axios.get("https://jsonplaceholder.typicode.com/user
s");
console.log(res.data);
} catch (err) {
console.log(err);
}
Interceptors ❌ ✅
ReactJs Intermediate 37
Feature Fetch Axios
6. Meri Analogy
Fetch = bare hands → you can do everything, but need extra effort
6. Key Takeaways
1. Fetch = native, lightweight, manual control
2. Basic Example
ReactJs Intermediate 38
import React, { useState, useEffect } from "react";
function Users() {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users")
.then(res => {
if (!res.ok) throw new Error("Network error");
return res.json();
})
.then(data => setUsers(data))
.catch(err => setError(err.message))
.finally(() => setLoading(false));
}, []);
return (
<ul>
{users.map(user => <li key={user.id}>{user.name}</li>)}
</ul>
);
}
Flow:
3. Async/Await Version
ReactJs Intermediate 39
useEffect(() => {
const fetchUsers = async () => {
try {
const res = await fetch("https://jsonplaceholder.typicode.com/users");
if (!res.ok) throw new Error("Network error");
const data = await res.json();
setUsers(data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
fetchUsers();
}, []);
4. Loading Spinner
if (error) return (
<div>
<p>Error: {error}</p>
<button onClick={() => window.location.reload()}>Retry</button>
</div>
);
ReactJs Intermediate 40
Pro-level user experience
6. Meri Analogy
Loading = waiter abhi order le ke aa raha hai → table empty, user wait
7. Key Takeaways
1. Loading state → track API/in-progress operation
ReactJs Intermediate 41