You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/blog/saulin18/Est-s-usando-mal-React.md
+16-16Lines changed: 16 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,7 +11,7 @@ canonicalUrl: ""
11
11
A lo largo de mis años en el desarrollo web con React he visto muchas veces que tienes que volver atrás a modificar componentes (o incluso rehacerlos desde 0) porque desde el inicio no se diseñó bien el componente, esto está **mal**.
12
12
13
13
Imagina que necesitas un componente button:
14
-
14
+
```
15
15
// Button.tsx
16
16
import React from 'react';
17
17
@@ -31,7 +31,7 @@ Imagina que necesitas un componente button:
Este componente en primera instancia puede parecer que cumple para lo que fue asignado, pero a medida que crece el proyecto hay una gran posibilidad de que tengas que hacerle muchos cambios por no hacerlo más abierto a la modificación.
36
36
37
37
**Problemas iniciales:**
@@ -43,7 +43,7 @@ Este componente en primera instancia puede parecer que cumple para lo que fue as
43
43
**¿Cómo mejorar este componente?**
44
44
45
45
Sencillamente tipando correctamente el evento de onClick y usando la prop children en lugar de pasarle el text como un string por props. Así no cierras el contenido que le puedes pasar al button haciéndolo más flexible.
46
-
46
+
```
47
47
// Button.tsx
48
48
import React, { MouseEvent, ReactNode } from 'react';
49
49
@@ -66,15 +66,15 @@ Sencillamente tipando correctamente el evento de onClick y usando la prop childr
## ComponentPropsWithRef, ComponentPropsWithoutRef, ComponentPropsWithChildren, la clave para hacer componentes reutilizables.
71
71
72
72
Incluso con los cambios anteriores, ese componente sigue sin ser del todo reutilizable, aún mantiene implementaciones en su estructura. Si quisieras añadir una nueva funcionalidad al botón, como cambiar su type (a submit, reset, etc.) o añadirle un handler para un evento, tendrías que ir al componente Button y añadir esas props una por una.
73
73
74
74
Aquí es donde React nos da una joya: ComponentPropsWithRef (o ComponentProps si no necesitas pasar referencias). Este tipo te permite heredar todas las propiedades nativas de un elemento HTML. Así tu componente de automáticamente aceptará type, onBlur, className, id, style, y todo lo que un componente HTML nativo pueda tener.
75
75
76
76
El truco es hacer **spread** de esas props al elemento HTML del que se extiende. Esto debería hacerse en todos tus componentes que envuelvan elementos HTML primitivos.
77
-
77
+
```
78
78
// Button.tsx
79
79
import React, { MouseEvent, ReactNode, ComponentPropsWithRef } from 'react';
80
80
@@ -103,9 +103,9 @@ Incluso con los cambios anteriores, ese componente sigue sin ser del todo reutil
// <Button onBlur={() => console.log('Salió del botón')} className="bg-blue-500 text-white p-2">Foco</Button>
105
105
// <Button aria-label="Cerrar ventana">X</Button>
106
-
106
+
```
107
107
Ahora nuestro componente recibe autocompletado, es cómodo para extender y está abierto a la extensión. Este mismo truco del ComponentPropsWithRef, ComponentPropsWithoutRef, ComponentPropsWithChildren, etc, lo pueden usar en cada elemento que envuelva un elemento HTML primitivo.
108
-
108
+
```
109
109
// Ejemplo con Input
110
110
import React, { ComponentPropsWithRef } from 'react';
111
111
@@ -122,7 +122,7 @@ Incluso con los cambios anteriores, ese componente sigue sin ser del todo reutil
**Lógica Personalizada y Cómo Evitar Sobreescrituras**
127
127
128
128
A veces querrás añadir tu propia lógica a las props nativas. Por ejemplo, podrías querer registrar un evento "X" cada vez que se hace clic en un botón además de la función onClick que el usuario pueda pasar.
@@ -132,7 +132,7 @@ El orden de esparcir las props importa. Si tienes una prop personalizada y una p
132
132
**Esparce las props antes de tus propiedades personalizadas.**
133
133
134
134
Ejemplo:
135
-
135
+
```
136
136
// Button.tsx
137
137
import React, { MouseEvent, ReactNode, ComponentPropsWithRef } from 'react';
138
138
@@ -166,9 +166,9 @@ Ejemplo:
166
166
// Uso:
167
167
// <Button onClick={() => alert('El usuario hizo click!')}>Mi Botón</Button>
168
168
// Aquí, la función 'handleInternalClick' se ejecutará primero, luego 'alert'
169
-
169
+
```
170
170
Ejemplo con el className:
171
-
171
+
```
172
172
// Button.tsx
173
173
import React, { ReactNode, ComponentPropsWithRef } from 'react';
@@ -245,11 +245,11 @@ Si una prop es necesaria para una nueva característica, hay dos maneras de mane
245
245
</button>
246
246
);
247
247
};
248
-
248
+
```
249
249
**Composition**
250
250
251
251
Todos los componentes que hemos visto han sido simples, cascarones, base, pero no siempre tenemos componentes así. Muchas veces tenemos componentes que componen por ejemplo un Button, un Input y en el mismo componente manejamos el estado de error (la clave es identificar los elementos relacionados de la UI). Aquí es donde entra la Composition. Podemos hacer un componente que haga spread y extienda de varios componentes HTML para así hacerlo aún más reutilizable.
252
-
252
+
```
253
253
// InputField.tsx
254
254
import React, { ComponentPropsWithRef, ReactNode } from 'react';
255
255
@@ -315,7 +315,7 @@ Todos los componentes que hemos visto han sido simples, cascarones, base, pero n
315
315
};
316
316
317
317
export default InputField;
318
-
318
+
```
319
319
Este enfoque, donde construyes componentes robustos y flexibles que se basan en los elementos HTML nativos y se pueden extender fácilmente, es una forma excelente de trabajar en React. Verás que muchas librerías de componentes modernas, como Shadcn, adoptan principios muy similares.
320
320
321
321
PD: El uso de Typescript no se aborda en este artículo por no ser una introducción a React, sino más bien a buenas prácticas. Si no estás usando Typescript **por favor**, empieza a hacerlo.
0 commit comments