This page's data is fetched entirely in the browser after JS loads. Watch the loading state — that's CSR in action. No server-side data fetching.
↑ Server sent <div>Loading...</div>. JS ran, fetched data, then React hydrated the UI.
State that lives in the component, triggers re-render on change.
const [count, setCount] = useState(0);
// useState returns [currentValue, setter]
// Calling setter → triggers re-render
// Functional update (safe for async): setCount(c => c + 1)// 1. No dependency array → runs after EVERY render
useEffect(() => { console.log('every render') });
// 2. Empty array → runs ONCE on mount (CSR fetch pattern)
useEffect(() => { fetchData() }, []);
// 3. With deps → runs when deps change (componentDidUpdate)
useEffect(() => { fetchUser(id) }, [id]);
// 4. Cleanup → returned fn runs before next effect / unmount
useEffect(() => {
const sub = subscribe(userId);
return () => sub.unsubscribe(); // cleanup!
}, [userId]);