A lo largo y ancho del mundo de Angular2+, el componente es la principal entidad o bloque de construcción de aplicaciones Angular. Cada componente consiste en:

  • Una plantilla HTML que declara lo que se representa en la página.
  • Una clase TypeScript que define el comportamiento
  • Un selector CSS que define cómo se utiliza el componente en una plantilla
  • Opcionalmente, estilos CSS aplicados a la plantilla (sea css, scss, less).

Hasta aquí, es lo que nos enseña la propia web de Angular sobre componentes junto a más información como su ciclo de vida (lifecycle), entradas/salidas (Input, Output), y un largo etcétera.

Pero a parte de esta definición de lo que es y significa, vamos a conocer su tipología en función de varios puntos de vista (o por su diseño) publicados por diferentes medios. Este será un pequeño resumen de los tipos de componentes de Angular.

Jerarquía

Como sabes se organizan de forma jerárquica (como un árbol) dentro de la página de modo que encontramos:

NombreCaracterísticas
RootInicio o raíz de la jerarquía
LeafÚltimo o final de la jerarquía
ParentTiene un Child
Child / NestedTiene un Parent

Pueden darse diferentes combinaciones. Por ejemplo:

  • Un componente root a la vez es parent si contiene algún componente child.
  • Un componente leaf es también un componente child si tiene un parent.
  • Un componente root puede ser a la vez un componente leaf si es el único componente.

Estado

Por estado nos referimos a los datos o propiedades que determinan el comportamiento y la representación de un componente en un momento determinado. El estado puede incluir entradas del usuario, datos leídos de alguna fuente de información (base de datos, cookies, localstorage, …) o cualquier variable que afecte la apariencia y la funcionalidad del componente.

NombreCaracterísticas
StatefulMantiene el estado
StatelessNo contiene estado

Diseño por capas de la vista

Para qué lo vamos a utilizar o su funcionalidad dentro de la aplicación, es decir según su comportamiento dentro del diseño de la vista.

NombreCaracterísticas
Smart / Container / Impure
No solo depende de sus entradas, sino también de algún tipo de datos externos (fuera del ámbito del mismo), que no se pasan directamente a través de sus “input”. También puede producir algunos efectos secundarios que no se emiten a través de la salida “output”.
Presentational / Dumb / Pure
Es un componente que, para los datos recibidos (entradas), siempre se verá y se comportará de la misma manera, posiblemente también produzca otros datos (eventos, a través de salidas).

Habitualmente los componentes “Presentational” suelen ser “Stateless”, pero puede mantener un pequeño estado mientras cumpla su funcionalidad “pure”.

Por entrada o «input» sería tanto por el decorador @Input() como por el signal input<unknown>();
Por salida u «output» sería tanto por el decorador @Output() como por el signal output<unknown>();

Otros

Podemos encontrar también estos otros tipos:

NombreCaracterísticas
StandaloneNo necesita ser declarado en el módulo (ngModule). Activando la propiedad “standalone” del decorador @Component.
@Component({ standalone: true })
GenericLa clase typescript del componente define genéricos. Ejemplo:
@Component({})
export class ListComponent<TData = unknown> {}

Links de interés:

https://blog.angular-university.io/angular-2-smart-components-vs-presentation-components-whats-the-difference-when-to-use-each-and-why
https://jackthenomad.com/how-to-write-good-composable-and-pure-components-in-angular-2-1756945c0f5b
https://blog.angular-university.io/angular-standalone-components