React Course PDF
React Course PDF
Copy
---
## 1. Component-Based Architecture
**Use**: Build reusable UI elements.
```jsx
// Functional Component
function Button(props) {
return <button onClick={props.onClick}>{props.label}</button>;
}
// Usage
<Button label="Click Me" onClick={() => console.log("Clicked!")} />
jsx
Copy
jsx
Copy
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
4. Props
Use: Pass data from parent to child components.
jsx
Copy
function UserCard({ name, age }) {
return (
<div>
<h2>{name}</h2>
<p>Age: {age}</p>
</div>
);
}
// Usage
<UserCard name="John Doe" age={30} />
5. useEffect Hook
Use: Handle side effects (e.g., API calls).
jsx
Copy
import { useState, useEffect } from 'react';
function DataFetcher() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => setData(data));
}, []); // Empty dependency array = runs once on mount
6. Conditional Rendering
Use: Show/hide elements based on conditions.
jsx
Copy
jsx
Copy
function TodoList({ todos }) {
return (
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
);
}
8. Context API
Use: Share global state without prop drilling.
jsx
Copy
function App() {
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
function Toolbar() {
const theme = useContext(ThemeContext);
return <div>Current Theme: {theme}</div>;
}
9. React Router
Use: Handle client-side navigation.
jsx
Copy
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
function App() {
return (
<Router>
<Link to="/about">About</Link>
<Route path="/about" component={AboutPage} />
</Router>
);
}
jsx
Copy
function LoginForm() {
const [email, setEmail] = useState('');
return (
<form onSubmit={handleSubmit}>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<button type="submit">Submit</button>
</form>
);
}
Copy
// Usage
<MemoizedComponent value={someValue} />
jsx
Copy
// Button.module.css
.error { color: red; }
// Button.jsx
import styles from './Button.module.css';
function Button() {
return <button className={styles.error}>Error Button</button>;
}
jsx
Copy
import { render, screen } from '@testing-library/react';
import Button from './Button';
Folder Structure:
Copy
src/
components/
hooks/
contexts/
utils/
jsx
Copy
3. State Management
useState
jsx
Copy
useReducer
jsx
Copy
jsx
Copy
function App() {
return (
<UserContext.Provider value="Alice">
<Profile />
</UserContext.Provider>
);
}
function Profile() {
const user = useContext(UserContext);
return <div>User: {user}</div>;
}
Custom Hooks
jsx
Copy
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;
}
jsx
Copy
useEffect(() => {
const timer = setInterval(() => console.log('Tick'), 1000);
return () => clearInterval(timer); // Cleanup on unmount
}, []);
jsx
Copy
function FileUpload() {
const fileInput = useRef();
jsx
Copy
function LoginForm() {
const { register, handleSubmit, formState: { errors } } = useForm();
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register('email', { required: true })} />
{errors.email && <span>Email is required</span>}
<button type="submit">Submit</button>
</form>
);
}
jsx
Copy
function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/users/:userId" element={<UserProfile />} />
</Routes>
);
}
function UserProfile() {
const { userId } = useParams();
return <h1>User ID: {userId}</h1>;
}
jsx
Copy
// Store setup
import { configureStore } from '@reduxjs/toolkit';
// Slice
const counterSlice = createSlice({
name: 'counter',
initialState: 0,
reducers: {
increment: (state) => state + 1,
},
});
// Component usage
import { useSelector, useDispatch } from 'react-redux';
const count = useSelector(state => state.counter);
const dispatch = useDispatch();
<button onClick={() => dispatch(increment())}>+</button>
9. Error Boundaries
Use: Catch JavaScript errors in components.
jsx
Copy
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, info) {
logErrorToService(error, info);
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
// Usage
<ErrorBoundary>
<BuggyComponent />
</ErrorBoundary>
jsx
Copy
// pages/index.js (Next.js)
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return { props: { data } };
}
jsx
Copy
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<HeavyComponent />
</Suspense>
);
}
jsx
Copy
Copy
Copy
interface UserProps {
name: string;
age: number;
isAdmin?: boolean;
}
14. Deployment
Use: Deploy to Vercel/Netlify.
bash
Copy
jsx
Copy
Copy
// Usage
<MouseTracker render={({ x, y }) => <div>X: {x}, Y: {y}</div>} />
jsx
Copy
function withLogger(WrappedComponent) {
return function (props) {
useEffect(() => {
console.log('Component rendered:', WrappedComponent.name);
}, []);
return <WrappedComponent {...props} />;
};
}