clase:daw:diw:1eval:tema03.b
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Próxima revisión | Revisión previa | ||
| clase:daw:diw:1eval:tema03.b [2025/11/03 11:37] – creado - editor externo 127.0.0.1 | clase:daw:diw:1eval:tema03.b [2026/10/23 23:04] (actual) – Reorganización del módulo: contenido movido a las páginas nuevas de clase:daw:diw claude | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== 3. Creación de componentes: | ||
| - | Hemos visto como crear un componente que genera todo el HTML: | ||
| - | |||
| - | <sxh html> | ||
| - | <boton funcion=" | ||
| - | </ | ||
| - | |||
| - | Sin embargo este componente tiene dos problemas. | ||
| - | * No podemos elegir si genera un ''< | ||
| - | * No es tan personlizable porque no podemos cambiar nada sino es modificando el propio componente botón. | ||
| - | |||
| - | |||
| - | Para mejorar eso, podríamos modificar el componente botón y hacer que solo fuera un atributo de la siguiente forma: | ||
| - | |||
| - | <sxh html> | ||
| - | <a boton funcion=" | ||
| - | </ | ||
| - | |||
| - | ¿Que hemos ganado ahora? Pues que tenemos ahora toda la potencia del tag ''< | ||
| - | |||
| - | <sxh html> | ||
| - | <a boton funcion=" | ||
| - | </ | ||
| - | |||
| - | Es decir podemos añadir todos los atributos que habría en un ''< | ||
| - | |||
| - | |||
| - | |||
| - | Empecemos desde el principio del '''': | ||
| - | |||
| - | <sxh ts; | ||
| - | import {Component, | ||
| - | |||
| - | @Component({ | ||
| - | selector: ' | ||
| - | template: '< | ||
| - | styleUrl: ' | ||
| - | encapsulation: | ||
| - | }) | ||
| - | export class Boton { | ||
| - | @Input() funcion:' | ||
| - | |||
| - | |||
| - | } | ||
| - | </ | ||
| - | |||
| - | * El valor del '' | ||
| - | * Ya no usamos '' | ||
| - | * Por último decimos en '' | ||
| - | |||
| - | ===== Etiqueta Host ===== | ||
| - | ¿Que queremos que haga realmente nuestro componente? Pues simplemente es establecer el valor del atributo '' | ||
| - | Es decir que el el que está " | ||
| - | |||
| - | Veamos unos ejemplo de que es **Host** | ||
| - | |||
| - | |||
| - | * **Host** hace referencia a la etiqueta ''< | ||
| - | <sxh html> | ||
| - | <a boton funcion=" | ||
| - | </ | ||
| - | |||
| - | * **Host** hace referencia a la etiqueta ''< | ||
| - | <sxh html> | ||
| - | <button boton funcion=" | ||
| - | </ | ||
| - | |||
| - | |||
| - | |||
| - | ===== @HostBinding ===== | ||
| - | Pues lo que queremos es que nuestro componente modifique el atributo '' | ||
| - | |||
| - | <sxh ts; | ||
| - | import {Component, | ||
| - | |||
| - | @Component({ | ||
| - | selector: ' | ||
| - | template: '< | ||
| - | styleUrl: ' | ||
| - | encapsulation: | ||
| - | }) | ||
| - | export class Boton implements OnChanges | ||
| - | @Input() funcion:' | ||
| - | |||
| - | @HostBinding(' | ||
| - | get clazz(): string { | ||
| - | return `boton funcion-${this.funcion}`; | ||
| - | } | ||
| - | |||
| - | } | ||
| - | </ | ||
| - | |||
| - | El decorador '' | ||
| - | |||
| - | <note tip> | ||
| - | Recuerda que '' | ||
| - | <sxh ts> | ||
| - | get clazz(): string { | ||
| - | return `boton funcion-${this.funcion}`; | ||
| - | } | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | |||
| - | El problema aquí el que no podríamos tener valores en '' | ||
| - | |||
| - | Es decir que el siguiente ejemplo no funcionaría, | ||
| - | |||
| - | <sxh html> | ||
| - | <a boton class=" | ||
| - | </ | ||
| - | |||
| - | Aunque si que funcionaría el siguiente ya que nuestro componente no modifica ni el atributo '' | ||
| - | |||
| - | <sxh html> | ||
| - | <a boton routerLink="/ | ||
| - | </ | ||
| - | |||
| - | Así que ¿como lo arreglamos? Pues retornando un objeto con las clases que vamos a añadir en vez de un '' | ||
| - | |||
| - | <sxh typescript; title: | ||
| - | import {Component, Input, ViewEncapsulation, | ||
| - | |||
| - | @Component({ | ||
| - | selector: ' | ||
| - | template: '< | ||
| - | styleUrl: ' | ||
| - | encapsulation: | ||
| - | }) | ||
| - | export class Boton { | ||
| - | @Input() funcion:' | ||
| - | |||
| - | |||
| - | @HostBinding(' | ||
| - | get clazz(): Record< | ||
| - | return { | ||
| - | ' | ||
| - | |||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | }; | ||
| - | } | ||
| - | |||
| - | } | ||
| - | </ | ||
| - | |||
| - | Ahora retornamos un objeto con las clases CSS que podrían haber y son un booleano indicando si está finalmente o no, dejando sin tocar el resto de clases. | ||
| - | |||
| - | <note tip> | ||
| - | Fíjate en que el tipo de datos de la propiedad '' | ||
| - | Que significa que es un objeto cuyas claves son un '' | ||
| - | |||
| - | |||
| - | La definición de '' | ||
| - | <sxh ts> | ||
| - | type Record<K extends keyof any, T> = { | ||
| - | [P in K]: T; | ||
| - | }; | ||
| - | </ | ||
| - | |||
| - | Mas información: | ||
| - | * [[https:// | ||
| - | |||
| - | </ | ||
| - | |||
| - | ===== ViewEncapsulation ===== | ||
| - | Nos falta por explicar el valor de '' | ||
| - | |||
| - | <sxh typescript; title: | ||
| - | import {Component, Input, ViewEncapsulation, | ||
| - | |||
| - | @Component({ | ||
| - | selector: ' | ||
| - | template: '< | ||
| - | styleUrl: ' | ||
| - | encapsulation: | ||
| - | }) | ||
| - | export class Boton { | ||
| - | @Input() funcion:' | ||
| - | @Input() importancia : ' | ||
| - | |||
| - | @HostBinding(' | ||
| - | get clazz(): Record< | ||
| - | return { | ||
| - | ' | ||
| - | |||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | |||
| - | }; | ||
| - | } | ||
| - | |||
| - | } | ||
| - | </ | ||
| - | |||
| - | El enumerado [[https:// | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | Existe '' | ||
| - | |||
| - | ¿Porque es importante ahora esta propiedad y porque la hemos cambiado a '' | ||
| - | |||
| - | Resulta que si ponemos el valor por defecto de '' | ||
| - | Sin embargo , con el cambio que hemos hecho , los estilos CSS se van a usar ahora fuera de los tags de '' | ||
| - | así que es necesario hacer los estilos CSS públicos, no // | ||
| - | |||
| - | Vale, pero ahora tenemos un problema. Tenemos las clases CSS '' | ||
| - | Por lo tanto debemos cambiar los estilos de los componentes para que no //choquen// entre los distintos componentes. | ||
| - | |||
| - | Para evitar que choquen los nombres de los estilos CSS entre los distintos componentes se usan las nomenclaturas de: | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | |||
| - | Más adelante en el curso se explicará en que consisten estas nomenclaturas. | ||
| - | |||
| - | Pero los estilos ahora quedan de la siguiente forma: | ||
| - | |||
| - | <sxh css; | ||
| - | .boton { | ||
| - | font-family: | ||
| - | font-size: 16px; | ||
| - | padding: 6px; | ||
| - | |||
| - | border-radius: | ||
| - | border-width: | ||
| - | border-style: | ||
| - | |||
| - | display: inline-block; | ||
| - | cursor: pointer; | ||
| - | text-decoration: | ||
| - | |||
| - | |||
| - | border-color: | ||
| - | background-color: | ||
| - | color: #ffffff; | ||
| - | } | ||
| - | |||
| - | .boton--funcion-normal { | ||
| - | border-color: | ||
| - | background-color: | ||
| - | color: #ffffff; | ||
| - | } | ||
| - | |||
| - | .boton--funcion-alternativa { | ||
| - | border-color: | ||
| - | background-color: | ||
| - | color: #ffffff; | ||
| - | } | ||
| - | |||
| - | .boton--funcion-peligrosa { | ||
| - | border-color: | ||
| - | background-color: | ||
| - | color: #ffffff; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Y el código queda finalmente así: | ||
| - | |||
| - | <sxh ts, title: | ||
| - | import {Component, Input, ViewEncapsulation, | ||
| - | |||
| - | @Component({ | ||
| - | selector: ' | ||
| - | template: '< | ||
| - | styleUrl: ' | ||
| - | encapsulation: | ||
| - | }) | ||
| - | export class Boton { | ||
| - | @Input() funcion:' | ||
| - | |||
| - | @HostBinding(' | ||
| - | get clazz(): Record< | ||
| - | return { | ||
| - | ' | ||
| - | |||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | |||
| - | }; | ||
| - | } | ||
| - | |||
| - | } | ||
| - | </ | ||
| - | |||
clase/daw/diw/1eval/tema03.b.1762166241.txt.gz · Última modificación: por 127.0.0.1
