Componentes

Los componentes son la base fundamental de TypesCraft. Te permiten crear interfaces de usuario reutilizables y modulares. Cada componente puede contener su propia lógica y estado, lo que lo hace perfecto para construir aplicaciones complejas.

¿Qué es un Componente?

Un componente es una clase que extiende de Component y que implementa tres métodos principales:

  • build(context: Context) - Este método es obligatorio y debe retornar un árbol de widgets que define la interfaz del componente.
  • init() - Se ejecuta una sola vez cuando el componente es inicializado.
  • dispose() - Se ejecuta cuando el componente es desmontado, permitiendo limpiar recursos.

Creando un Componente

Para crear un componente, necesitas extender la clase Component y definir al menos el método build:


import { Component, Context } from "@seigenta/TypesCraft/widget";

class MiComponente extends Component {
    build(context: Context) {
        return new Container({
            child: new Text({text: "¡Hola Mundo!"}),
            style: new ContainerStyle({
                background: Color.blue(),
                padding: EdgeSize.all(Size.px(10))
            })
        });
    }
}
                    

Método init()

El método init() es perfecto para inicializar el estado del componente o configurar listeners:


class MiComponente extends Component {
    private contador: number = 0;

    init() {
        // Inicializar el estado
        this.contador = 0;
        
        // Configurar un intervalo
        setInterval(() => {
            this.contador++;
            this.setState();
        }, 1000);
    }

    build(context: Context) {
        return new Text({text: `Contador: ${this.contador}`});
    }
}
                    

Método dispose()

El método dispose() te permite limpiar recursos cuando el componente es desmontado:


class MiComponente extends Component {
    private intervalo: NodeJS.Timeout;

    init() {
        this.intervalo = setInterval(() => {
            // Lógica del intervalo
        }, 1000);
    }

    dispose() {
        // Limpiar el intervalo cuando el componente se desmonta
        clearInterval(this.intervalo);
    }

    build(context: Context) {
        return new Text({text: "Componente con intervalo"});
    }
}
                    

Estado del Componente

Los componentes pueden mantener su propio estado interno. Para actualizar el estado y hacer que el componente se vuelva a renderizar, usa el método setState():


class MiComponente extends Component {
    private texto: string = "Hola";

    cambiarTexto() {
        this.texto = "Adiós";
        this.setState(); // Esto hará que el componente se vuelva a renderizar
    }

    build(context: Context) {
        return new Text({text: this.texto});
    }
}
                    

Exportar e Importar Componentes

Puedes definir tus componentes en archivos separados (por ejemplo, MiComponente.ts) y exportarlos. Luego, puedes importarlos y utilizarlos dentro de otros componentes o en la configuración principal de tu aplicación. Esto promueve la reutilización y mantiene tu código organizado.


// archivo: src/components/MiBoton.ts
import { Component, Context, Text, Button, ButtonStyle, Color } from "@seigenta/TypesCraft/widget";

export class MiBoton extends Component {
    build(context: Context) {
        return new Button({
            child: new Text({ text: "Click Me!" }),
            style: new ButtonStyle({ background: Color.green() }),
            onClick: () => console.log("Botón clickeado!")
        });
    }
}

// archivo: src/main.ts
// Solo importamos lo necesario para este ejemplo específico
import { Component, Context } from "@seigenta/TypesCraft/widget";
import Container from "@seigenta/TypesCraft/widgets/containers/container";
import { MiBoton } from "./components/MiBoton";


class App extends Component {
    build(context: Context) {
        return new Container({
            child: new MiBoton() // Usando el componente importado
        });
    }
}

class Main extends MaterialApp {
    build(context: Context) {
        return new App();
    }
}

const app = new Main();
app.run();