Typescript 및 TailwindCSS를 사용하여 React에서 Accordion 구성 요소 만들기
20302 단어 reacttailwindcsstypescripthooks
빌딩 블록
아코디언을 만드는 데 필요한 기본 구성 요소는 다음과 같습니다.
내 아코디언 구성 요소에 전달하고 싶은 두 가지 소품은
title
(아코디언이 닫힐 때 표시되는 텍스트) 및 content
(아코디언이 열려 있을 때 표시되는 추가 텍스트)입니다.useState
React 후크에 익숙하지 않은 경우 괄호 안의 값은 상태 변수의 초기 값입니다. const active
의 시작 값은 false
(닫힘)입니다. transform duration-700 ease
는 TailwindCSS 유틸리티 클래스를 나타냅니다(이 클래스는 기본적으로 장면을 설정하여 구성 요소에 어느 시점에서 무언가를 애니메이션으로 만들고 싶다고 알려줍니다).import React, { useState } from 'react'
interface AccordionProps {
title: React.ReactNode
content: React.ReactNode
}
export const Accordion: React.FC<AccordionProps> = ({ title, content }) => {
const [active, setActive] = useState(false)
const [height, setHeight] = useState('0px')
const [rotate, setRotate] = useState('transform duration-700 ease')
// ...
}
레이어 1
다음 레이어에는 활성 상태를 true 또는 false로 설정하는 일종의 토글 기능이 있습니다. 이 함수는 활성 상태에 따라 높이와 회전도 설정해야 합니다.
active
상태가 true
일 때 높이를 아직 결정하지 못했습니다. 그것은 아래의 다음 레이어에 있습니다.import React, { useState } from 'react'
interface AccordionProps {
title: React.ReactNode
content: React.ReactNode
}
export const Accordion: React.FC<AccordionProps> = ({ title, content }) => {
const [active, setActive] = useState(false)
const [height, setHeight] = useState('0px')
const [rotate, setRotate] = useState('transform duration-700 ease')
function toggleAccordion() {
setActive(active === false ? true : false)
// @ts-ignore
setHeight(active ? '0px' : `${someHeightYetToBeDetermined}px`)
setRotate(active ? 'transform duration-700 ease' : 'transform duration-700 ease rotate-180')
}
// ...
}
레이어 2
다른 계층으로 올라가면 아코디언의 내부 콘텐츠가 상주할 DOM을 대상으로 하는 방법이 필요합니다. 이를 수행하는 쉬운 방법은 React가 제공하는 유용한
useRef
후크를 사용하는 것입니다. 이를 통해 my <div>
가 앉을 content
를 구체적으로 대상으로 지정할 수 있습니다.이 작업을 수행하기 위해 인라인 CSS를 사용하여 위의 레이어 1에서 소개한
maxHeight
상태 변수와 동일한 height
속성을 설정했습니다. 즉, 활성화되지 않은 경우 높이는 0
(숨김)입니다. 이제 contentSpace
를 참조하여 ${contentSpace.current.scrollHeight}px
를 사용하여 아코디언이 활성화될 때의 높이를 결정할 수 있습니다.또한 멋진 열기 및 닫기 애니메이션 효과를 원했기 때문에 TailwindCSS를 사용하여
ease-in-out
효과를 설정했습니다.import React, { useRef, useState } from 'react'
import { appConfig } from '../../../../appConfig'
interface AccordionProps {
title: React.ReactNode
content: React.ReactNode
}
export const Accordion: React.FC<AccordionProps> = ({ title, content }) => {
// ...
const contentSpace = useRef<HTMLDivElement>(null)
function toggleAccordion() {
setActive(active === false ? true : false)
// @ts-ignore
setHeight(active ? '0px' : `${contentSpace.current.scrollHeight}px`)
setRotate(active ? 'transform duration-700 ease' : 'transform duration-700 ease rotate-180')
}
return (
<div
ref={contentSpace}
style={{ maxHeight: `${height}` }}
className="overflow-auto transition-max-height duration-700 ease-in-out"
>
<div className="pb-10">{content}</div>
</div>
)
}
함께 모아서
이제 남은 것은 모든 빌딩 블록을 함께 모으는 것뿐입니다. 전체 Accordion 구성 요소의 모습은 다음과 같습니다.
여기서 주목해야 할 주요 사항은 다음과 같습니다.
title
소품이 갈매기 모양 아이콘과 함께 있습니다. onClick
함수에 연결한 이 버튼에 toggleAccordion
핸들러를 추가했습니다. rotate
에 classNames
상태 변수를 추가했습니다. 아코디언의 active
상태에 따라 아이콘을 회전시키는 Tailwind 클래스입니다.import React, { useRef, useState } from 'react'
import { appConfig } from '../../../../appConfig'
interface AccordionProps {
title: React.ReactNode
content: React.ReactNode
}
export const Accordion: React.FC<AccordionProps> = ({ title, content }) => {
const [active, setActive] = useState(false)
const [height, setHeight] = useState('0px')
const [rotate, setRotate] = useState('transform duration-700 ease')
const contentSpace = useRef(null)
function toggleAccordion() {
setActive(active === false ? true : false)
// @ts-ignore
setHeight(active ? '0px' : `${contentSpace.current.scrollHeight}px`)
setRotate(active ? 'transform duration-700 ease' : 'transform duration-700 ease rotate-180')
}
return (
<div className="flex flex-col">
<button
className="py-6 box-border appearance-none cursor-pointer focus:outline-none flex items-center justify-between"
onClick={toggleAccordion}
>
<p className="inline-block text-footnote light">{title}</p>
<img
src={`${appConfig.publicUrl}/img/icons/chevron-up.svg`}
alt="Chevron icon"
className={`${rotate} inline-block`}
/>
</button>
<div
ref={contentSpace}
style={{ maxHeight: `${height}` }}
className="overflow-auto transition-max-height duration-700 ease-in-out"
>
<div className="pb-10">{content}</div>
</div>
</div>
)
}
그리고 그게 다야! 무슨 생각을 했어? 이 문제를 개선할 수 있는 방법이 있습니까? 트위터나 인스타그램에서 채팅합시다.
Reference
이 문제에 관하여(Typescript 및 TailwindCSS를 사용하여 React에서 Accordion 구성 요소 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bionicjulia/creating-an-accordion-component-in-react-with-typescript-and-tailwindcss-1edo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)