Introdução
Neste laboratório, exploraremos como implementar um menu acordeão (accordion menu) recolhível em React usando componentes e hooks. O objetivo deste laboratório é fornecer uma experiência prática na construção de um menu acordeão funcional com múltiplos elementos de conteúdo recolhíveis. Ao final deste laboratório, você terá uma boa compreensão de como usar React para criar interfaces de usuário dinâmicas e interativas.
Acordeão Recolhível (Collapsible Accordion)
index.htmlescript.jsjá foram fornecidos na VM. Em geral, você só precisa adicionar código ascript.jsestyle.css.
Para renderizar um menu acordeão com múltiplos elementos de conteúdo recolhíveis, você pode seguir estes passos:
- Defina um componente
AccordionItemque renderiza um<button>e atualiza o componente enquanto notifica seu pai via o callbackhandleClick. - Use a prop
isCollapsedemAccordionItempara determinar sua aparência e definir seuclassName. - Defina um componente
Accordione use o hookuseState()para inicializar o valor da variável de estadobindIndexparadefaultIndex. - Filtre
childrenpara remover nós desnecessários, exceto paraAccordionItem, identificando o nome da função. - Use
Array.prototype.map()nos nós coletados para renderizar os elementos recolhíveis individuais. - Defina
changeItem, que será executado ao clicar no<button>de umAccordionItem. changeItemexecuta o callback passado,onItemClick, e atualizabindIndexcom base no elemento clicado.
Aqui está o 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>
);
Por favor, clique em 'Go Live' no canto inferior direito para executar o serviço web na porta 8080. Em seguida, você pode atualizar a aba Web 8080 para visualizar a página web.
Resumo
Parabéns! Você concluiu o laboratório de Acordeão Recolhível. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.