Skip to main content

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​

HookPurpose
useStateManage local component state
useEffectPerform side effects
useContextAccess context values
useRefAccess DOM or persist mutable values
useMemoMemoize expensive computations
useCallbackMemoize functions
useReducerAlternative to useState for complex logic
useLayoutEffectLike useEffect but fires before paint
useIdGenerate 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​

PackagePurpose
react-router-domRouting
axiosHTTP client
classnamesConditional class management
zustand / jotai / reduxState management
react-query / tanstack-queryServer-state management
framer-motionAnimations
react-hook-formForm management

🧾 References​