Saltar al contenido principal

Estructura de un componente

Naming Components

✅ PascalCase

✅ Por intención: ProductFiltersPanel, CartSummaryBar

Creación (reglas del archivo)

Componentes deben ser React Functional Components y pueden crearse con los snippets rfce o rfc

❌ No se permite el uso de React Arrow Function Components.

✅ Un solo componente por archivo (1 archivo = 1 componente exportado).

Favour Small Components

Regla práctica

✅ Si un componente supera ~150–200 líneas o mezcla 2 responsabilidades → split

✅ Si un return JSX parece “una página entera” → split en subcomponentes

Estructura de un componente

(1) Imports

(2) Tipos e Interfaces (TypeScript)

Justo después de imports y antes del componente.

Si el componente recibe props, definir interface [ComponentName]Props.

interface WalletFormProps {
formType: 'create' | 'update';
data?: TWalletBankAccount;
currencies: TCurrency[];
}

(3) Hooks (incluye state, refs, hooks custom y effects)

Orden interno recomendado:

  • State
  • Refs
  • Custom hooks
  • Effects (React.useEffect)

(4) Derived values (valores derivados)

Variables calculadas desde props/estado, sin side effects.

const isEditing = formType === 'update';
const userName = user?.name ?? '—';

(5) Handlers (funciones / manejadores de eventos)

Antes del return.

Convención: handleX / onX.

const handleSubmit = (event: React.FormEvent) => {
event.preventDefault();
// submit logic
};

(6) JSX (return)

El return debe contener solo JSX (sin lógica compleja).

return <form onSubmit={handleSubmit}>{/* UI */}</form>;

Ejemplo

import React from 'react';

interface WalletFormProps {
formType: 'create' | 'update';
data?: TWalletBankAccount;
currencies: TCurrency[];
}

export default function WalletForm({
formType,
data,
currencies,
}: WalletFormProps) {
// 1) Hooks — state
const [user, setUser] = React.useState<string>('');

// 1) Hooks — refs
const inputRef = React.useRef<HTMLInputElement>(null);

// 1) Hooks — custom hooks
useCustomHook();

// 1) Hooks — effects
React.useEffect(() => {
// side effects
}, []);

// 2) Derived values
const isEditing = formType === 'update';

// 3) Handlers
const handleSubmit = (event: React.FormEvent) => {
event.preventDefault();
// submit logic
};

// 4) JSX
return (
<form onSubmit={handleSubmit}>
<button type="submit">{isEditing ? 'Update' : 'Create'}</button>
</form>
);
}