es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema es que no estás pasando ningún hijo al componente Button cuando lo estás renderizando en tu componente App. En la implementación actual, solo estás pasando la propiedad hover al componente Button, que es independiente de la propiedad children que estás intentando pasarle a través del componente de orden superior WithHover.

    Para solucionar esto, necesitas envolver el componente Button en un elemento padre y pasarle las propiedades children, de la siguiente manera:

    <withhover>
      <div>
        <button>foo</button>
      </div>
    </withhover>
    

    Esto garantizará que el componente Button reciba sus propiedades children y se puedan acceder a ellas a través del parámetro props.children en el componente.

    Alternativamente, puedes modificar el componente Button para que espere explícitamente una propiedad hover, de la siguiente manera:

    function Button({ hover, children }) {
      console.log('props', { hover, children });
      return <button>{children}</button>;
    }
    

    Esto garantizará que el componente Button reciba la propiedad hover y pueda acceder a ella a través del parámetro props.hover en el componente.

Comments are closed.