
React Cheatsheet
16 of 16 code examples
Components
Functional components and JSX
Components// Functional component
function Welcome({ name }) {
return <h1>Hello, {name}!</h1>;
}
// Arrow function component
const Button = ({ onClick, children }) => (
<button onClick={onClick}>{children}</button>
);
// Conditional rendering
{users.length === 0 ? (
<p>No users found</p>
) : (
users.map(user => <UserCard key={user.id} user={user} />)
)}
useState
State management
Hooksimport { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const [name, setName] = useState('');
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>+</button>
<input
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="Enter name"
/>
</div>
);
}
// Object state
const [user, setUser] = useState({
name: '',
email: ''
});
// Update object
setUser(prev => ({ ...prev, name: 'Alice' }));
useEffect
Side effects and lifecycle
Hooksimport { useState, useEffect } from 'react';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
// Fetch data on mount
useEffect(() => {
fetch(`/api/users/${userId}`)
.then(res => res.json())
.then(setUser);
}, [userId]); // Dependency array
// Update document title
useEffect(() => {
document.title = user ? user.name : 'Loading...';
}, [user]);
// Cleanup
useEffect(() => {
const timer = setInterval(() => {
console.log('Timer tick');
}, 1000);
return () => clearInterval(timer);
}, []);
return <div>{user?.name}</div>;
}
Custom Hooks
Reusable hook logic
Hooks// Local storage hook
function useLocalStorage(key, initialValue) {
const [value, setValue] = useState(() => {
const stored = localStorage.getItem(key);
return stored ? JSON.parse(stored) : initialValue;
});
useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);
return [value, setValue];
}
// API hook
function useApi(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(url)
.then(res => res.json())
.then(data => {
setData(data);
setLoading(false);
});
}, [url]);
return { data, loading };
}
// Usage
function MyComponent() {
const [name, setName] = useLocalStorage('name', '');
const { data, loading } = useApi('/api/users');
}
Context API
Global state management
State Managementimport { createContext, useContext, useState } from 'react';
// Create context
const ThemeContext = createContext();
// Provider
export function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
);
}
// Custom hook
export function useTheme() {
return useContext(ThemeContext);
}
// Usage
function ThemedButton() {
const { theme, setTheme } = useTheme();
return (
<button onClick={() => setTheme('dark')}>
Current: {theme}
</button>
);
}
useMemo & useCallback
Performance optimization
Performanceimport { useMemo, useCallback, memo } from 'react';
// Memoize expensive calculation
function ExpensiveComponent({ items }) {
const total = useMemo(() => {
return items.reduce((sum, item) => sum + item.value, 0);
}, [items]);
return <div>Total: {total}</div>;
}
// Memoize function
function TodoList({ todos, onToggle }) {
const handleToggle = useCallback((id) => {
onToggle(id);
}, [onToggle]);
return (
<div>
{todos.map(todo => (
<TodoItem key={todo.id} todo={todo} onToggle={handleToggle} />
))}
</div>
);
}
// Memoize component
const TodoItem = memo(function TodoItem({ todo, onToggle }) {
return (
<div onClick={() => onToggle(todo.id)}>
{todo.text}
</div>
);
});
Forms
Form handling
Formsimport { useState } from 'react';
function ContactForm() {
const [form, setForm] = useState({
name: '',
email: '',
message: ''
});
const handleChange = (e) => {
setForm({
...form,
[e.target.name]: e.target.value
});
};
const handleSubmit = (e) => {
e.preventDefault();
console.log('Submitted:', form);
};
return (
<form onSubmit={handleSubmit}>
<input
name="name"
value={form.name}
onChange={handleChange}
placeholder="Name"
/>
<input
name="email"
value={form.email}
onChange={handleChange}
placeholder="Email"
/>
<textarea
name="message"
value={form.message}
onChange={handleChange}
placeholder="Message"
/>
<button type="submit">Submit</button>
</form>
);
}
useRef
DOM references and values
Hooksimport { useRef, useEffect } from 'react';
function FocusInput() {
const inputRef = useRef();
const focusInput = () => {
inputRef.current.focus();
};
return (
<div>
<input ref={inputRef} />
<button onClick={focusInput}>Focus</button>
</div>
);
}
// Previous value
function usePrevious(value) {
const ref = useRef();
useEffect(() => {
ref.current = value;
});
return ref.current;
}
Lazy Loading
Code splitting
Performanceimport { lazy, Suspense } from 'react';
// Lazy load component
const HeavyComponent = lazy(() => import('./HeavyComponent'));
function App() {
return (
<div>
<Suspense fallback={<div>Loading...</div>}>
<HeavyComponent />
</Suspense>
</div>
);
}
Error Boundaries
Error handling
Error Handlingclass ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, info) {
console.error('Error:', error, info);
}
render() {
if (this.state.hasError) {
return <h2>Something went wrong.</h2>;
}
return this.props.children;
}
}
// Usage
<ErrorBoundary>
<MyComponent />
</ErrorBoundary>
React Router
Client-side routing
Routingimport { 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 />} />
<Route path="/users/:id" element={<UserDetail />} />
</Routes>
</BrowserRouter>
);
}
// Get URL params
import { useParams } from 'react-router-dom';
function UserDetail() {
const { id } = useParams();
return <div>User ID: {id}</div>;
}
useReducer
Complex state logic
Hooksimport { useReducer } from 'react';
function todoReducer(state, action) {
switch (action.type) {
case 'ADD_TODO':
return {
...state,
todos: [...state.todos, {
id: Date.now(),
text: action.payload,
completed: false
}]
};
case 'TOGGLE_TODO':
return {
...state,
todos: state.todos.map(todo =>
todo.id === action.payload
? { ...todo, completed: !todo.completed }
: todo
)
};
default:
return state;
}
}
function TodoApp() {
const [state, dispatch] = useReducer(todoReducer, { todos: [] });
const addTodo = (text) => {
dispatch({ type: 'ADD_TODO', payload: text });
};
return (
<div>
{/* Todo list */}
</div>
);
}
Portals
Render outside DOM hierarchy
Advancedimport { createPortal } from 'react-dom';
function Modal({ isOpen, onClose, children }) {
if (!isOpen) return null;
return createPortal(
<div className="modal" onClick={onClose}>
<div onClick={e => e.stopPropagation()}>
{children}
</div>
</div>,
document.body
);
}
// Usage
<Modal isOpen={true} onClose={() => {}}>
<h2>Modal Content</h2>
</Modal>
Real-World: Todo App
Complete todo application
Real Worldimport { useState } from 'react';
function TodoApp() {
const [todos, setTodos] = useState([]);
const [input, setInput] = useState('');
const addTodo = () => {
if (input.trim()) {
setTodos([...todos, {
id: Date.now(),
text: input,
completed: false
}]);
setInput('');
}
};
const toggleTodo = (id) => {
setTodos(todos.map(todo =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
));
};
return (
<div>
<input
value={input}
onChange={(e) => setInput(e.target.value)}
onKeyPress={(e) => e.key === 'Enter' && addTodo()}
/>
<button onClick={addTodo}>Add</button>
{todos.map(todo => (
<div key={todo.id}>
<input
type="checkbox"
checked={todo.completed}
onChange={() => toggleTodo(todo.id)}
/>
<span style={{
textDecoration: todo.completed ? 'line-through' : 'none'
}}>
{todo.text}
</span>
</div>
))}
</div>
);
}
Data Fetching
API integration
Real Worldimport { useState, useEffect } from 'react';
function UserList() {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch('/api/users')
.then(res => res.json())
.then(data => {
setUsers(data);
setLoading(false);
});
}, []);
if (loading) return <div>Loading...</div>;
return (
<div>
{users.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
);
}
Authentication
User auth with context
Real Worldimport { createContext, useContext, useState } from 'react';
const AuthContext = createContext();
export function AuthProvider({ children }) {
const [user, setUser] = useState(null);
const login = (email, password) => {
// Login logic
setUser({ name: 'John', email });
};
const logout = () => {
setUser(null);
};
return (
<AuthContext.Provider value={{ user, login, logout }}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
return useContext(AuthContext);
}
// Usage
function LoginForm() {
const { login } = useAuth();
const handleSubmit = (e) => {
e.preventDefault();
login('email', 'password');
};
return <form onSubmit={handleSubmit}>{/* ... */}</form>;
}