Introducción
En este laboratorio, exploraremos cómo implementar un menú desplegable tipo acordeón en React utilizando componentes y hooks. El objetivo de este laboratorio es proporcionar una experiencia práctica en la construcción de un menú acordeón funcional con múltiples elementos de contenido desplegables. Al final de este laboratorio, tendrás una buena comprensión de cómo utilizar React para crear interfaces de usuario dinámicas e interactivas.
Menú desplegable tipo acordeón
index.htmlyscript.jsya se han proporcionado en la máquina virtual. En general, solo es necesario agregar código ascript.jsystyle.css.
Para renderizar un menú acordeón con múltiples elementos de contenido desplegables, puedes seguir estos pasos:
- Defina un componente
AccordionItemque renderice un<button>y actualice el componente mientras notifica a su padre a través de la devolución de llamadahandleClick. - Utilice la propiedad
isCollapsedenAccordionItempara determinar su apariencia y establecer suclassName. - Defina un componente
Accordiony utilice el hookuseState()para inicializar el valor de la variable de estadobindIndexcondefaultIndex. - Filtrar
childrenpara eliminar nodos innecesarios, exceptoAccordionItem, identificando el nombre de la función. - Utilice
Array.prototype.map()en los nodos recolectados para renderizar los elementos desplegables individuales. - Defina
changeItem, que se ejecutará al hacer clic en el<button>de unAccordionItem. changeItemejecuta la devolución de llamada pasada,onItemClick, y actualizabindIndexsegún el elemento clicado.
Aquí está el código:
.accordion-item.collapsed {
display: none;
}
.accordion-item.expanded {
display: block;
}
.accordion-button {
display: block;
width: 100%;
}
const AccordionItem = ({ label, isCollapsed, handleClick, children }) => {
return (
<>
<button className="accordion-button" onClick={handleClick}>
{label}
</button>
<div
className={`accordion-item ${isCollapsed ? "collapsed" : "expanded"}`}
aria-expanded={isCollapsed}
>
{children}
</div>
</>
);
};
const Accordion = ({ defaultIndex, onItemClick, children }) => {
const [bindIndex, setBindIndex] = React.useState(defaultIndex);
const changeItem = (itemIndex) => {
if (typeof onItemClick === "function") onItemClick(itemIndex);
if (itemIndex !== bindIndex) setBindIndex(itemIndex);
};
const items = children.filter((item) => item.type.name === "AccordionItem");
return (
<>
{items.map(({ props }) => (
<AccordionItem
isCollapsed={bindIndex !== props.index}
label={props.label}
handleClick={() => changeItem(props.index)}
children={props.children}
/>
))}
</>
);
};
ReactDOM.createRoot(document.getElementById("root")).render(
<Accordion defaultIndex="1" onItemClick={console.log}>
<AccordionItem label="A" index="1">
Lorem ipsum
</AccordionItem>
<AccordionItem label="B" index="2">
Dolor sit amet
</AccordionItem>
</Accordion>
);
Haga clic en 'Go Live' en la esquina inferior derecha para ejecutar el servicio web en el puerto 8080. Luego, puede actualizar la pestaña Web 8080 para previsualizar la página web.
Resumen
¡Felicidades! Has completado el laboratorio de Menú desplegable tipo acordeón. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.