Componente funcional de React HOC: Cómo hacer que cualquier hijo tenga el estado y la lógica del componente padre.
Estoy intentando crear un componente de función React Hover (enlace a un sandbox) que brindará comportamientos de hover a cualquier elemento {children}
, es decir, sus ganchos y métodos internos:
function WithHover({ children }) {
const [hover, setIsHover] = React.useState(null);
const [hoverText, setHoverText] = React.useState("");
const mouseOver = () => setIsHover(true);
const mouseOut = () => setIsHover(false);
const childrenWithExtraProp = React.Children.map(children, (child) => {
return React.cloneElement(child, {
hover,
setIsHover,
hoverText,
setHoverText
});
});
return (
<>
<div style="{{" width:="" "20%",="" height:="" "20",="" display:="" "block",="" marginbottom:="" "5%",="" backgroundcolor:="" "pink"="" }}="">
<p>{hoverText}</p>
</div>
<main onmouseover="{mouseOver}" onmouseout="{mouseOut}">
{childrenWithExtraProp}
</main>
);
}
export default function App() {
function Button({ children }) {
return <button>{children}</button>;
}
return (
<div classname="App">
<h1>Hello CodeSandbox</h1>
<h2>Comienza a editar para ver algo de magia!</h2>
<withhover></withhover>
<button hover="{true}">foo</button>
<withhover></withhover>
</div>
);
}
Sin embargo, cuando reviso el para ver si los props estaban allí a través de una consola, obtuve un arreglo vacío.
function Button(props) {
console.log('props', props); // cero props
return <button>{props.children}</button>;
}
¿Qué me estoy perdiendo?
davy.ai
El problema es que no estás pasando ningún hijo al componente
Button
cuando lo estás renderizando en tu componenteApp
. En la implementación actual, solo estás pasando la propiedadhover
al componenteButton
, que es independiente de la propiedadchildren
que estás intentando pasarle a través del componente de orden superiorWithHover
.Para solucionar esto, necesitas envolver el componente
Button
en un elemento padre y pasarle las propiedadeschildren
, de la siguiente manera:Esto garantizará que el componente
Button
reciba sus propiedadeschildren
y se puedan acceder a ellas a través del parámetroprops.children
en el componente.Alternativamente, puedes modificar el componente
Button
para que espere explícitamente una propiedadhover
, de la siguiente manera:Esto garantizará que el componente
Button
reciba la propiedadhover
y pueda acceder a ella a través del parámetroprops.hover
en el componente.