Bird
Raised Fist0
Angularframework~5 mins

Smart and dumb component pattern in Angular - Cheat Sheet & Quick Revision

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is a smart component in Angular?
A smart component manages data and logic. It fetches data, handles user actions, and passes data to dumb components. Think of it as the brain controlling the app's behavior.
Click to reveal answer
beginner
What is a dumb component in Angular?
A dumb component only displays data and emits events. It does not manage data or logic. It’s like a simple display or form that relies on smart components for data.
Click to reveal answer
intermediate
Why use the smart and dumb component pattern?
It separates concerns: smart components handle logic and data, dumb components handle UI. This makes code easier to read, test, and reuse, like having a manager and workers each with clear jobs.
Click to reveal answer
intermediate
How do smart and dumb components communicate in Angular?
Smart components pass data to dumb components using @Input properties. Dumb components send events back using @Output EventEmitters. This is like sending messages back and forth clearly.
Click to reveal answer
beginner
Give an example of a dumb component's responsibility.
A dumb component might show a list of items and emit an event when an item is clicked. It does not fetch or change the list, just shows it and tells the smart component what happened.
Click to reveal answer
What is the main role of a smart component?
AOnly display UI without logic
BManage data and business logic
CEmit events without receiving data
DStyle the application
How does a dumb component receive data from a smart component?
AUsing Angular routing
BUsing @Output EventEmitters
CDirectly accessing services
DUsing @Input properties
Which of the following is NOT a characteristic of dumb components?
ADisplay data
BEmit user events
CFetch data from APIs
DHave no business logic
Why is separating smart and dumb components helpful?
AImproves code clarity and reuse
BMakes components bigger
CRemoves the need for services
DAvoids using Angular directives
How do dumb components notify smart components about user actions?
AUsing @Output EventEmitters
BUsing @Input properties
CBy calling smart component methods directly
DBy changing global variables
Explain the difference between smart and dumb components in Angular.
Think about who controls data and who just shows it.
You got /4 concepts.
    Describe how smart and dumb components communicate and why this pattern is useful.
    Consider the flow of data and events between components.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main role of a smart component in Angular's smart and dumb component pattern?
      easy
      A. To handle user input events only
      B. To only display data without logic
      C. To manage data and business logic
      D. To style the user interface

      Solution

      1. Step 1: Understand smart component responsibilities

        Smart components are designed to handle data fetching, state management, and business logic.
      2. Step 2: Differentiate from dumb components

        Dumb components focus on displaying data and emitting events, not managing data or logic.
      3. Final Answer:

        To manage data and business logic -> Option C
      4. Quick Check:

        Smart component = data and logic [OK]
      Hint: Smart components handle data and logic, dumb ones display only [OK]
      Common Mistakes:
      • Confusing dumb components as managing data
      • Thinking smart components only display UI
      • Assuming smart components handle styling only
      2. Which of the following is the correct way to pass data from a smart component to a dumb component in Angular?
      easy
      A. Use a service to directly modify dumb component variables
      B. @Output() data: any; in dumb component and bind in template
      C. Use @ViewChild to access dumb component data
      D. @Input() data: any; in dumb component and bind in template

      Solution

      1. Step 1: Identify data flow direction

        Data flows from smart to dumb components via inputs.
      2. Step 2: Use Angular syntax for input binding

        Dumb components declare @Input() properties to receive data from parents.
      3. Final Answer:

        @Input() data: any; -> Option D
      4. Quick Check:

        Data to dumb = @Input() [OK]
      Hint: Use @Input() to pass data down from smart to dumb [OK]
      Common Mistakes:
      • Using @Output() to pass data down instead of events up
      • Trying to access dumb component data directly via ViewChild
      • Modifying dumb component state via services without inputs
      3. Given the following Angular code, what will be the output displayed by the dumb component?
      /* Smart component template */
      <app-dumb [title]="pageTitle" (clicked)="onClicked()"></app-dumb>
      
      /* Smart component class */
      pageTitle = 'Hello World';
      onClicked() { console.log('Clicked!'); }
      
      /* Dumb component template */
      <h1>{{ title }}</h1>
      <button (click)="clicked.emit()">Click Me</button>
      
      /* Dumb component class */
      @Input() title: string;
      @Output() clicked = new EventEmitter<void>();
      medium
      A. Displays 'Hello World' and logs 'Clicked!' on button click
      B. Displays nothing and logs 'Clicked!' on button click
      C. Displays 'Hello World' but does not log anything
      D. Throws an error because of missing @Output() decorator

      Solution

      1. Step 1: Analyze data binding from smart to dumb

        The smart component passes 'Hello World' via [title] input, so dumb displays it.
      2. Step 2: Analyze event emission and handling

        The dumb component emits clicked event on button click, smart component listens and logs 'Clicked!'.
      3. Final Answer:

        Displays 'Hello World' and logs 'Clicked!' on button click -> Option A
      4. Quick Check:

        Input shows title, output triggers log [OK]
      Hint: Input shows data, output triggers event handled by smart [OK]
      Common Mistakes:
      • Thinking dumb component logs directly
      • Assuming missing decorators cause runtime error here
      • Ignoring event binding from dumb to smart
      4. Identify the error in this dumb component code that prevents it from emitting events to the smart component:
      @Component({
        selector: 'app-dumb',
        template: `<button (click)="clicked.emit()">Click</button>`
      })
      export class DumbComponent {
        clicked = new EventEmitter<void>();
      }
      medium
      A. EventEmitter should be imported from '@angular/core/testing'
      B. Missing @Output() decorator on the clicked property
      C. The template syntax for click event is incorrect
      D. The clicked property should be a function, not EventEmitter

      Solution

      1. Step 1: Check event emitter declaration

        The clicked property must have @Output() decorator to emit events to parent.
      2. Step 2: Verify imports and syntax

        EventEmitter is correctly imported from '@angular/core', template syntax is correct.
      3. Final Answer:

        Missing @Output() decorator on the clicked property -> Option B
      4. Quick Check:

        @Output() missing = no event emission [OK]
      Hint: Always add @Output() to EventEmitter properties [OK]
      Common Mistakes:
      • Forgetting @Output() decorator
      • Importing EventEmitter from wrong package
      • Miswriting template event binding syntax
      5. You want to refactor a large Angular component that mixes data fetching, logic, and UI display into smart and dumb components. Which approach best follows the smart and dumb component pattern?
      hard
      A. Create a smart component to fetch data and handle logic, pass data via @Input() to dumb components that only display UI and emit events
      B. Move all logic and data fetching into dumb components and keep smart components only for styling
      C. Combine smart and dumb components into one to reduce complexity
      D. Use dumb components to fetch data and smart components to display UI

      Solution

      1. Step 1: Separate concerns by responsibility

        Smart components should handle data fetching and logic, dumb components focus on UI and user interaction.
      2. Step 2: Use Angular bindings correctly

        Pass data from smart to dumb via @Input() and receive events via @Output().
      3. Final Answer:

        Create a smart component to fetch data and handle logic, pass data via @Input() to dumb components that only display UI and emit events -> Option A
      4. Quick Check:

        Smart = logic/data, Dumb = UI only [OK]
      Hint: Smart handles data/logic; dumb handles UI and events [OK]
      Common Mistakes:
      • Putting logic in dumb components
      • Merging smart and dumb components unnecessarily
      • Reversing data flow direction