Control de Props en React: Comunicación entre Componentes Padres e Hijos
Resumen
Controla desde el componente padre el estado de un toggle hijo en React con TypeScript usando el patrón control props. Verás cómo definir props opcionales, manejar useState y notificar cambios para crear componentes reutilizables, mantenibles y con comunicación clara padre-hijo.
¿Qué es control props y por qué usarlo en React?
Este patrón permite que el padre controle el comportamiento del hijo, mientras el hijo notifica su estado. Aquí, el hijo administra un boolean interno (encendido/apagado) y, cuando cambia, llama una función pasada por props que informa al padre.
Gestión del estado: el padre conoce y controla el estado del hijo.
Comunicación acotada: solo entre padre e hijo, fácil de razonar.
Reutilización y mantenibilidad: el hijo es personalizable y portable.
¿Cómo fluye la comunicación padre-hijo?
El hijo guarda un estado local con useState iniciado desde isToggled.
Al alternar, calcula el nuevo valor y ejecuta onToggle(newValue) si existe.
El padre pasa isToggled y onToggle, y puede reflejar el estado en pantalla.
¿Qué estructura de props y tipos en TypeScript?
ToggleProps con isToggled?: boolean y onToggle?: (value: boolean) => void.
Props opcionales con el signo “?”.
Valor inicial en el hijo: false por defecto para empezar apagado.
¿Cómo construir el componente hijo toggle en TypeScript?
El hijo define sus props, inicializa su estado con useState y expone una función toggle que alterna el valor, actualiza el estado y notifica al padre si la función llega por props.
onToggle: función opcional para notificar al padre.
internalToggle: estado local que alterna entre true y false.
¿Cómo renderiza y notifica el botón?
Un button con onClick llama a toggle.
La etiqueta del botón usa un ternario para mostrar “on” u “off”.
¿Cómo controla el padre el estado del toggle?
El padre crea su propio estado, lo pasa como isToggled y entrega setToggleState como onToggle. Así refleja y controla el estado del hijo, además de mostrarlo en pantalla.
importReact,{ useState }from'react';importTogglefrom'./Toggle';constParent=()=>{const[toggleState, setToggleState]=useState(false);return(<div><ToggleisToggled={toggleState}onToggle={setToggleState}/><p>Toggle is {toggleState ?'on 🔛':'off 🤒'}</p></div>);};exportdefaultParent;
¿Qué beneficios aporta este patrón?
Control total del flujo desde el padre.
Comunicación predecible y fácil de depurar.
Hijo personalizable y reutilizable en distintas vistas.
Mayor flexibilidad y mantenibilidad del código.
¿Qué otro ejemplo construirías con control props? Cuéntalo en los comentarios y pongamos manos a la obra.
Hola. El estado interno se usa para mantener la logica y responsibilidad en ese componente hijo y lo puedes reutilizar sin obligar a cada padre a gestionar ese estado, y ademas con este patron lo haces lo suficientemente flexible para que un padre pueda enterarse de ese cambio y haga lo que tenga que hacer, pero no obligas a todos los padres a gestionar esa misma logica de ese estado cada vez (solo le avisas que algo cambio)
creo que Tambien puede ayudar a que la responsibilidad de ese componente hijo no se vea afectado por los diferentes formas que lo usaran sus padres
Buenas!
Depende un poco de lo que necesites, si pones un estado interno evitas tener la obligación de pasarle las props en caso de que no necesites saber el cambio en el componente padre, ten en cuenta que puedes llamarlo desde varios sitios y en alguno puedes necesitar saber el cambio y en otro no, entonces "ahorras" el crear estados en componentes donde no lo necesites.
Por otro lado se puede dar el caso de que el botón que activa el toggle no necesites tenerlo dentro del hijo, por ejemplo puedes necesitar activarlo desde un botón que tienes en algún otro sitio, y ahí sería necesario hacer como tu dices, porque el control del toggle no está internamente.
Igualmente, según mi experiencia, creo que se utiliza más ponerlo sólo en el padre, es más fácil centralizar el estado, y propagar cambios si lo necesitas hacía otros componentes hijos
Primera vez que veo un curso de React así, estoy pensando más de lo normal, eso quiere decir que es un buen curso.
Me encanta leer esto, Wilderk !!! 🔥
El patrón Control Props es un enfoque en React que permite al componente padre gestionar el estado y el comportamiento de un componente hijo a través de props. Este patrón soluciona el problema de la comunicación entre componentes y facilita la reutilización del código.
Implementación
Componente Hijo: Recibe props como isToggle (booleano) y onToggle (función para notificar al padre).
Componente Padre: Mantiene el estado y pasa las props al hijo.
Casos de Uso
Formularios donde el padre controla la validación.
Componentes de UI que necesitan ser reutilizados con diferentes estados.
Este patrón mejora la mantenibilidad y la escalabilidad en aplicaciones React.
En TypeScript, tanto type como interface se utilizan para definir estructuras de datos, pero hay diferencias clave:
Extensibilidad: interface permite la extensión mediante la palabra clave extends, lo que facilita la creación de jerarquías de tipos. type no tiene esta capacidad.
Unión de tipos: type puede definir uniones (type A = B | C), mientras que interface no puede.
Implementación en clases: interface puede ser implementada por clases (class MyClass implements MyInterface), mientras que type no.
Ambos son útiles, pero elige interface para definiciones que necesiten extensibilidad y type para uniones o definiciones más complejas.
¿En que casos es mejor utilizar control props y en que casos el context?
Yo creo que depende sde la magnitud del feature que debes hacer. Si la lógica involucra solo a un componente hijo y un padre, le veo sentido usar este patrón, pero si ya involucra, por ejemplo, un padre y tres hijos, y que adicional los hijos tengan hijos y exista lógica que se relacione al padre, sería mejor usar un contexto, sobre todo para evitar el prop drealing que podría generarse desde el padre hasta sus nietos, por así decirlo. Saludos crack!
en los archivos de la clase estan subidos los archivos del node_modules
por fin que buen curso de platzi sobre react, era necesario renovar los cursos de la ruta de react, me parece muy profundo y complicado, me encanta!
se puede ahorrar varias lineas de codigo creo que asi quedaria mas sencilloimport import { useState } from "react";
type ToogleProps = { isToggled: boolean; onToggle: (value: boolean) => void;};
export const Toggle: React.FC<ToogleProps> = ({ isToggled, onToggle,}) => { return ( <> <button onClick={()=> onToggle(!isToggled)}>{isToggled ? "ON" : "OFF"}</button> </> );};
export const ParentComponent = () => { const [togglesState, setTogglesState] = useState(true) return( <div> <p>Toggle is</p> <Toggle isToggled={togglesState} onToggle={setTogglesState}></Toggle> </div> ); };
La gracia del patrón control props es poder utilizar el componente child con o sin props de su componente padre. Lo cual requiere de más código pero hace al componente más flexible.
¿Pueden darme otro ejemplo de donde conviene usar Control Props? Gracias
Otro ejemplo de uso para el Control Props puede ser el uso de botones genericos, donde reciba por parametros una funcion a ejecutar en el onClick. Por ejemplo
constButton=({ text, onClick, color })=>{return(<button style={{backgroundColor: color }} onClick={onClick}>{text}</button>);};// Uso<Button text="Guardar" onClick={handleSave} color="green"/><Button text="Cancelar" onClick={handleCancel} color="red"/>