{post.title}
+By {post.author}
+{user.email}
+By {post.author}
+This is a server component!
+{error.message}
+ +{user.email}
+ +{user.email}
+ +${product.price}
+{user.email}
+${product.price}
+{user.email}
+ {user.avatar &&{user.email}
+ + {user.isActive ? 'Active' : 'Inactive'} + + + +Welcome, {user?.name}
+ +{user.email}
+{comment}
{/* Safe - React escapes special characters */} +| Name | +Status | +Actions | +|
|---|---|---|---|
| {user.name} | +{user.email} | ++ + {user.status} + + | +
+
+
+ Current status: {user.status}. Click to change to{' '}
+ {user.status === 'active' ? 'inactive' : 'active'}
+
+ |
+
Manage your profile information here.
+Adjust your application settings.
+Manage your billing information.
+X: {x}, Y: {y}
+ +{user.email}
+X: {mousePosition.x}, Y: {mousePosition.y}
+ +{user.email}
+ +By {post.author}
@@ -2885,16 +2906,16 @@ async function BlogList() { } // Client Component (runs in browser) -'use client'; +("use client"); -import { useState } from 'react'; +import { useState } from "react"; interface SearchBarProps { onSearch: (query: string) => void; } function SearchBar({ onSearch }: SearchBarProps) { - const [query, setQuery] = useState(''); + const [query, setQuery] = useState(""); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); @@ -2920,7 +2941,7 @@ function BlogPage() {${product.price}
@@ -3201,6 +3231,7 @@ function ProductList({ products, filter, sortBy }: ProductListProps) { ``` **useCallback - Function Memoization:** + ```tsx interface TodoListProps { todos: Array<{ @@ -3211,32 +3242,33 @@ interface TodoListProps { } function TodoList({ todos }: TodoListProps) { - const [filter, setFilter] = useState<'all' | 'active' | 'completed'>('all'); + const [filter, setFilter] = useState<"all" | "active" | "completed">("all"); // Memoized callback - prevents child re-renders const handleToggleTodo = useCallback((todoId: number) => { - setTodos(prevTodos => - prevTodos.map(todo => - todo.id === todoId - ? { ...todo, completed: !todo.completed } - : todo + setTodos((prevTodos) => + prevTodos.map((todo) => + todo.id === todoId ? { ...todo, completed: !todo.completed } : todo ) ); }, []); // Empty dependency array since setTodos is stable // Memoized callback with dependencies - const handleFilterChange = useCallback((newFilter: 'all' | 'active' | 'completed') => { - console.log('Filter changed to:', newFilter); - setFilter(newFilter); - }, []); + const handleFilterChange = useCallback( + (newFilter: "all" | "active" | "completed") => { + console.log("Filter changed to:", newFilter); + setFilter(newFilter); + }, + [] + ); // Memoized filtered todos const filteredTodos = useMemo(() => { switch (filter) { - case 'active': - return todos.filter(todo => !todo.completed); - case 'completed': - return todos.filter(todo => todo.completed); + case "active": + return todos.filter((todo) => !todo.completed); + case "completed": + return todos.filter((todo) => todo.completed); default: return todos; } @@ -3248,40 +3280,40 @@ function TodoList({ todos }: TodoListProps) { currentFilter={filter} onFilterChange={handleFilterChange} /> - {filteredTodos.map(todo => ( -