📖 Scenario: Imagine you want your React app to respond when the browser window size changes. This helps make your app look good on phones, tablets, and computers.
🎯 Goal: You will build a custom React hook called useWindowWidth that tracks the current width of the browser window. Then you will use this hook inside a component to show the window width on the screen.
📋 What You'll Learn
Create a custom hook named useWindowWidth
Use React's useState and useEffect hooks inside useWindowWidth
Add an event listener for the window resize event inside useEffect
Return the current window width from useWindowWidth
Create a functional component WindowWidthDisplay that uses useWindowWidth
Display the current window width inside WindowWidthDisplay
💡 Why This Matters
🌍 Real World
Custom hooks let you share logic like event listeners or data fetching across many components in React apps, making code cleaner and easier to maintain.
💼 Career
React developers often write custom hooks to handle common tasks like tracking window size, form inputs, or API calls, which is a valuable skill in frontend development jobs.
Progress0 / 4 steps
1
Set up the initial React component
Create a functional React component called WindowWidthDisplay that returns a <div> with the text "Window width will show here".
React
Hint
Start by writing a simple function that returns some JSX with a div and text.
2
Create the custom hook skeleton
Create a custom hook named useWindowWidth that returns 0 for now. Add this function above WindowWidthDisplay.
React
Hint
Custom hooks are functions that start with 'use'. For now, just return 0 to test.
3
Add state and effect to track window width
Inside useWindowWidth, use useState to create a state variable width initialized to window.innerWidth. Use useEffect to add a window resize event listener that updates width. Return width from the hook.
React
Hint
Use useState to store width and useEffect to update it on resize. Don't forget to clean up the event listener.
4
Use the custom hook inside the component
Inside WindowWidthDisplay, call useWindowWidth to get the current width. Replace the div text with {`Window width: ${width}px`} where width is the value from the hook.
React
Hint
Call your hook inside the component and use the returned width in the JSX.
Practice
(1/5)
1. What is the main reason to create a custom hook in React?
easy
A. To create new HTML elements
B. To reuse stateful logic across multiple components
C. To style components with CSS
D. To replace React components entirely
Solution
Step 1: Understand the purpose of hooks
Hooks let you use React features like state and effects inside functions.
Step 2: Identify why custom hooks are used
Custom hooks let you reuse stateful logic easily across components without repeating code.
Final Answer:
To reuse stateful logic across multiple components -> Option B
Quick Check:
Custom hooks = reuse logic [OK]
Hint: Custom hooks always reuse logic, not UI or styles [OK]
Common Mistakes:
Thinking custom hooks create UI elements
Confusing hooks with styling tools
Believing hooks replace components
2. Which of the following is the correct way to name a custom hook in React?
easy
A. hookUseFetch
B. fetchDataHook
C. FetchData
D. useFetchData
Solution
Step 1: Recall naming rules for custom hooks
Custom hooks must start with the word "use" to follow React conventions.
Step 2: Check each option
Only "useFetchData" starts with "use" correctly.
Final Answer:
useFetchData -> Option D
Quick Check:
Custom hook names start with "use" [OK]
Hint: Custom hooks always start with 'use' prefix [OK]
A. It causes an infinite loop because setCount is called inside useEffect without dependencies
B. It returns a function instead of a value
C. It will never update count because useEffect has an empty dependency array
D. It uses useState incorrectly by initializing with 0
Solution
Step 1: Check useEffect dependencies
The effect has no dependency array.
Step 2: Understand setCount behavior
setCount(count + 1) runs on every render since there are no dependencies, causing an infinite loop of re-renders.
Final Answer:
It causes an infinite loop because setCount is called inside useEffect without dependencies -> Option A
Quick Check:
Missing deps in useEffect = infinite loop [OK]
Hint: useEffect without deps array runs every render [OK]
Common Mistakes:
Thinking the effect runs only once without deps array
Confusing return value type
Misunderstanding dependency array role
5. You want to create a custom hook useFetch that fetches data from a URL and returns { data, loading, error }. Which approach correctly handles loading state and errors inside the hook?
hard
A. Use useState for data, loading, error; use useEffect to fetch and update states with try/catch inside async function
B. Use only useState for data and ignore loading and error states
C. Fetch data directly in the component and pass it to the hook as a parameter
D. Use useEffect without useState and return data from fetch promise
Solution
Step 1: Identify state needs for fetch
Fetching data requires tracking data, loading status, and errors, so useState is needed for all three.
Step 2: Use useEffect with async fetch and error handling
Inside useEffect, define an async function with try/catch to fetch data and update states accordingly.
Final Answer:
Use useState for data, loading, error; use useEffect to fetch and update states with try/catch inside async function -> Option A
Quick Check:
Fetch with useState and useEffect + try/catch [OK]
Hint: Manage data, loading, error with useState and useEffect [OK]
Common Mistakes:
Ignoring loading or error states
Fetching outside useEffect causing infinite loops
Returning unresolved promises
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.