React
A quick reference for modern React (v18+). Covers core concepts, hooks, state management, context, performance, and testing.
⚙️ Basics
JSX
- Combines JavaScript + HTML-like syntax
- Must return one parent element
- Use
{}for embedding JS expressions
const name = "John";
const element = <h1>Hello, {name}!</h1>;
Components
React apps are built from components (functions or classes).
Function Component
function Welcome({ name }) {
return <h1>Hello, {name}</h1>;
}
Class Component (legacy)
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
Props
- Read-only data passed from parent → child
function Greeting({ name }) {
return <p>Hello {name}</p>;
}
<Greeting name="Alice" />
Conditional Rendering
{isLoggedIn ? <Dashboard /> : <Login />}
{notifications.length > 0 && <Alert />}
Lists & Keys
<ul>
{items.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
🔁 State and Lifecycle
useState
Manages local state in a function component.
import { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>Count: {count}</button>
);
}
useEffect
Performs side effects (fetching, subscriptions, timers, etc.).
import { useEffect } from "react";
useEffect(() => {
console.log("Component mounted");
return () => console.log("Cleanup");
}, []); // dependencies
Common patterns:
[]→ run once (on mount)[dep]→ run when dep changes- no array → run after every render
🪝 Common Hooks
| Hook | Purpose |
|---|---|
useState | Manage local component state |
useEffect | Perform side effects |
useContext | Access context values |
useRef | Access DOM or persist mutable values |
useMemo | Memoize expensive computations |
useCallback | Memoize functions |
useReducer | Alternative to useState for complex logic |
useLayoutEffect | Like useEffect but fires before paint |
useId | Generate stable unique IDs |
⚡ Handling Events
<button onClick={() => alert("Clicked!")}>Click me</button>
Passing event objects:
function handleClick(e) {
e.preventDefault();
console.log("Button clicked");
}
📋 Forms
Controlled Components
const [value, setValue] = useState("");
<input value={value} onChange={(e) => setValue(e.target.value)} />
Multiple Inputs
const [form, setForm] = useState({ name: "", email: "" });
function handleChange(e) {
setForm({ ...form, [e.target.name]: e.target.value });
}
<input name="name" onChange={handleChange} />
<input name="email" onChange={handleChange} />
🧩 Context API
Creating and Using Context
const ThemeContext = createContext("light");
function App() {
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
function Toolbar() {
const theme = useContext(ThemeContext);
return <button className={theme}>Styled</button>;
}
🧠 Custom Hooks
Encapsulate reusable logic.
function useWindowWidth() {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
const handleResize = () => setWidth(window.innerWidth);
window.addEventListener("resize", handleResize);
return () => window.removeEventListener("resize", handleResize);
}, []);
return width;
}
Usage:
const width = useWindowWidth();
🚀 Performance Optimization
Memoization
import { memo, useMemo, useCallback } from "react";
const ExpensiveComponent = memo(({ data }) => {
console.log("Rendered");
return <div>{data.value}</div>;
});
useMemo Example
const sorted = useMemo(() => items.sort(compareFn), [items]);
useCallback Example
const handleClick = useCallback(() => {
console.log("Clicked");
}, []);
🌐 Data Fetching
useEffect + fetch
const [data, setData] = useState([]);
useEffect(() => {
fetch("/api/users")
.then((res) => res.json())
.then(setData);
}, []);
With async/await
useEffect(() => {
const load = async () => {
const res = await fetch("/api/users");
setData(await res.json());
};
load();
}, []);
🧭 Routing (React Router v6+)
npm install react-router-dom
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<nav>
<Link to="/">Home</Link> | <Link to="/about">About</Link>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
🧰 State Management (Context + Reducer Example)
const CounterContext = createContext();
function reducer(state, action) {
switch (action.type) {
case "increment": return { count: state.count + 1 };
case "decrement": return { count: state.count - 1 };
default: return state;
}
}
function CounterProvider({ children }) {
const [state, dispatch] = useReducer(reducer, { count: 0 });
return (
<CounterContext.Provider value={{ state, dispatch }}>
{children}
</CounterContext.Provider>
);
}
function Counter() {
const { state, dispatch } = useContext(CounterContext);
return (
<>
<p>{state.count}</p>
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</>
);
}
🧱 Refs and DOM Access
const inputRef = useRef();
function focusInput() {
inputRef.current.focus();
}
<input ref={inputRef} />
<button onClick={focusInput}>Focus</button>
🧪 Testing (React Testing Library)
npm install --save-dev @testing-library/react @testing-library/jest-dom
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import Counter from "./Counter";
test("increments counter", async () => {
render(<Counter />);
await userEvent.click(screen.getByText("Increment"));
expect(screen.getByText("Count: 1")).toBeInTheDocument();
});
🧩 Common Patterns
Conditional ClassNames
<div className={active ? "active" : "inactive"} />
Destructuring Props
function User({ name, email }) {
return <p>{name} - {email}</p>;
}
Default Props
User.defaultProps = {
name: "Anonymous",
};
🧱 File Structure Example
src/
components/
Header.jsx
Footer.jsx
hooks/
useFetch.js
context/
AuthContext.js
pages/
Home.jsx
About.jsx
App.jsx
index.jsx
🧰 Useful Packages
| Package | Purpose |
|---|---|
react-router-dom | Routing |
axios | HTTP client |
classnames | Conditional class management |
zustand / jotai / redux | State management |
react-query / tanstack-query | Server-state management |
framer-motion | Animations |
react-hook-form | Form management |