📖 Scenario: You are building a simple Next.js app that shows a list of tasks. Each task can be either completed or not. You want to style the tasks differently based on their completion status.
🎯 Goal: Create a Next.js functional component that displays a list of tasks. Use conditional styling to show completed tasks with a green background and incomplete tasks with a red background.
📋 What You'll Learn
Create a list of tasks with exact names and completion status
Add a variable to hold the CSS class names for completed and incomplete tasks
Use conditional styling inside the JSX to apply the correct class based on task completion
Render the list with the correct styles applied
💡 Why This Matters
🌍 Real World
Conditional styling is common in web apps to show different states like completed tasks, errors, or active items clearly to users.
💼 Career
Front-end developers often use conditional styling patterns in React and Next.js to build interactive and accessible user interfaces.
Progress0 / 4 steps
1
Create the tasks data
Create a constant array called tasks with these exact objects: { id: 1, name: 'Buy groceries', completed: true }, { id: 2, name: 'Walk the dog', completed: false }, and { id: 3, name: 'Read a book', completed: true }.
NextJS
Hint
Use const tasks = [ ... ] with the exact objects inside.
2
Add CSS class names for styling
Create two constants called completedClass and incompleteClass. Set completedClass to the string 'bg-green-200 p-2 rounded' and incompleteClass to the string 'bg-red-200 p-2 rounded'.
NextJS
Hint
Define two constants with the exact class name strings for styling.
3
Use conditional styling in JSX
Create a functional component called TaskList that returns a <ul>. Inside, use tasks.map with task as the iterator. For each <li>, set the className to completedClass if task.completed is true, otherwise incompleteClass. Display task.name inside each <li>. Use task.id as the key.
NextJS
Hint
Use a ternary operator inside className to choose the style based on task.completed.
4
Add accessibility and export the component
Add an aria-label attribute with the value 'Task list' to the <ul> element inside the TaskList component. Ensure the component is exported as default.
NextJS
Hint
Add aria-label="Task list" inside the <ul> tag for accessibility.
Practice
(1/5)
1. In Next.js, which is the simplest way to apply a CSS class conditionally based on a boolean isActive inside a component's JSX?
easy
A. <div className='active' if={isActive}>Content</div>
B. <div className={isActive ? 'active' : ''}>Content</div>
C. <div className={if isActive then 'active'}>Content</div>
D. <div className={isActive && 'active' || 'inactive'}>Content</div>
Solution
Step 1: Understand JSX conditional class syntax
In JSX, you can use JavaScript expressions inside curly braces. The ternary operator condition ? valueIfTrue : valueIfFalse is a common way to apply classes conditionally.
Step 2: Evaluate each option's syntax
<div className={isActive ? 'active' : ''}>Content</div> uses the ternary operator correctly. Options B and C use invalid JSX syntax. <div className={isActive && 'active' || 'inactive'}>Content</div> uses a logical expression that can cause unexpected results.
Final Answer:
<div className={isActive ? 'active' : ''}>Content</div> -> Option B
Quick Check:
Use ternary operator for conditional classes = A [OK]
Hint: Use ternary inside className for simple true/false styling [OK]
Common Mistakes:
Using invalid JSX syntax like 'if' inside attributes
Confusing logical AND/OR for conditional classes
Forgetting to use curly braces for JS expressions
2. Which of the following is the correct syntax to conditionally add multiple CSS classes in Next.js JSX using template literals when isActive and isDisabled are booleans?
easy
A. className={['btn', isActive && 'active', isDisabled && 'disabled'].join(' ')}
Step 1: Understand template literals with conditional classes
Template literals use backticks and allow embedding expressions with ${}. Using logical AND returns the class name if true or false (which renders as the string 'false') if false.
Step 2: Check each option's syntax
className={`btn ${isActive && 'active'} ${isDisabled && 'disabled'}`} correctly uses template literals with logical AND. className='btn' + (isActive ? ' active' : '') + (isDisabled ? ' disabled' : '') uses string concatenation but misses curly braces for JSX expression. className={['btn', isActive && 'active', isDisabled && 'disabled'].join(' ')} uses an array join which works but is less common. className={btn isActive ? 'active' : '' isDisabled ? 'disabled' : ''} is invalid JSX syntax.
Final Answer:
className={`btn ${isActive && 'active'} ${isDisabled && 'disabled'}`} -> Option C
Quick Check:
Template literals with ${condition && 'class'} = C [OK]
Hint: Use backticks and ${condition && 'class'} for multiple classes [OK]
Common Mistakes:
Forgetting curly braces around JSX expressions
Using invalid syntax mixing strings and expressions
Not handling false values rendering as 'false' string
3. Given this Next.js component code snippet, what will be the rendered class attribute when isActive is false and isDisabled is true?
Step 1: Substitute boolean values into the template literal
Since isActive is false, isActive ? 'active' : '' becomes an empty string. Since isDisabled is true, isDisabled ? 'disabled' : '' becomes 'disabled'.
Step 2: Combine the strings with spaces
The final className string is btn disabled (note the double space between 'btn' and 'disabled' due to empty string). This renders as class="btn disabled", which browsers treat as btn disabled.
Final Answer:
class="btn disabled" -> Option A
Quick Check:
False condition yields empty string, true yields class = D [OK]
Hint: Replace ternary with values, watch spaces in template literals [OK]
Common Mistakes:
Assuming false condition adds 'active' class
Ignoring extra spaces in class string
Confusing true/false in ternary expressions
4. Identify the error in this Next.js JSX snippet for conditional styling and select the fix:
C. Change to {isError && 'error' || 'success'} and keep else attribute
D. Remove else='hidden' because JSX does not support 'else' attribute
Solution
Step 1: Identify invalid JSX attribute usage
JSX does not support an else attribute on elements. Conditional logic must be inside curly braces.
Step 2: Fix by removing invalid attribute
Removing else='hidden' leaves a valid ternary expression for className. To conditionally add 'hidden', use nested ternary or other logic inside className.
Final Answer:
Remove else='hidden' because JSX does not support 'else' attribute -> Option D
Quick Check:
JSX attributes must be valid props, no 'else' attribute = A [OK]
Hint: JSX attributes can't have 'else'; use ternary inside className [OK]
Common Mistakes:
Trying to use 'else' as an attribute in JSX
Not wrapping conditional logic inside curly braces
Confusing HTML attributes with JSX props
5. You want to apply conditional styling in a Next.js component where the class 'highlight' should be added only if isSelected is true and count is greater than zero. Which of these is the best way to write the className attribute to handle this condition cleanly?
Step 1: Analyze each option's logic and readability
className={`item ${isSelected && count > 0 ? 'highlight' : ''}`} uses a logical AND combined with ternary inside template literal, which can be confusing and may produce unexpected results. className={`item ${isSelected ? count > 0 ? 'highlight' : '' : ''}`} nests ternaries, which reduces readability. className={`item ${isSelected && count > 0 && 'highlight'}`} uses logical AND but if false returns false which renders as 'false' string in className. className={isSelected && count > 0 ? 'item highlight' : 'item'} uses a clear ternary outside template literal, returning full class strings, which is clean and safe.
Step 2: Choose the best practice for conditional classes
className={isSelected && count > 0 ? 'item highlight' : 'item'} clearly returns either 'item highlight' or 'item' string, avoiding false or empty strings in className, making it the best pattern for this condition.