--- title: Use Component Composition Patterns impact: HIGH impactDescription: Better code reuse and maintainability tags: components, composition, yield, blocks, contextual-components --- ## Use Component Composition Patterns Use component composition with yield blocks, named blocks, and contextual components for flexible, reusable UI patterns. **Named blocks** are for invocation consistency in design systems where you **don't want the caller to have full markup control**. They provide structured extension points while maintaining design system constraints - the same concept as named slots in other frameworks. **Incorrect (monolithic component):** ```glimmer-js // app/components/user-card.gjs import Component from '@glimmer/component'; class UserCard extends Component { } ``` **Correct (composable with named blocks):** ```glimmer-js // app/components/user-card.gjs import Component from '@glimmer/component'; class UserCard extends Component { } ``` **Usage with flexible composition:** ```glimmer-js // app/components/user-list.gjs import UserCard from './user-card'; ``` **Contextual components pattern:** ```glimmer-js // app/components/data-table.gjs import Component from '@glimmer/component'; import { hash } from '@ember/helper'; class HeaderCell extends Component { } class Row extends Component { } class Cell extends Component { } class DataTable extends Component { } ``` **Using contextual components:** ```glimmer-js // app/components/users-table.gjs import DataTable from './data-table'; ``` **Renderless component pattern:** ```glimmer-js // app/components/dropdown.gjs import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; import { action } from '@ember/object'; import { hash } from '@ember/helper'; class Dropdown extends Component { @tracked isOpen = false; @action toggle() { this.isOpen = !this.isOpen; } @action close() { this.isOpen = false; } } ``` ```glimmer-js // Usage import Dropdown from './dropdown'; ``` Component composition provides flexibility, reusability, and clean separation of concerns while maintaining type safety and clarity. Reference: [Ember Components - Block Parameters](https://guides.emberjs.com/release/components/block-content/)