231231
Swiper
Swiper를 가장 처음 사용했을 땐, Swiper React Components를 사용해서 개발했었다. Swiper와 SwiperSlide를 불러와서 적용한 후, Slide의 개수에 맞게 적용하면 되었기에 간단하고 편했다. 하지만 이젠 Swiper React Components를 사용하려 하면, 공식문서에 다음과 같은 문구를 보게 된다.
Swiper React components will likely to be removed in future versions. It is recommended to migrate to Swiper Element instead.
즉, 향후 버전에선 Swiper React Components가 제거될 가능성이 높다고 한다. 그래서 공식문서에서는 Swiper Element를 사용하라고 권장하고 있다.
Swiper Element
Swiper Element는 Web Component를 기반으로 만들어 졌다. 간단한 사용 방법은, 공식문서에서도 잘 소개되어 있다. 나는 이걸 다음과 같이 적용하여 사용하려 했다.
// components/common/swiper
import { Children, useEffect, useRef } from 'react';
import { SwiperContainer } from 'swiper/element';
import { register } from 'swiper/element/bundle';
import { ArrowRightCircle, ArrowLeftCircle } from 'lucide-react';
type SwiperWrapperProps = {
children: React.ReactNode;
className?: string;
};
export const SwiperWrapper: React.FC<SwiperWrapperProps> = ({ children }) => {
return (
<>
<SwiperContainerComp>{children}</SwiperContainerComp>
</>
);
};
type SwiperContainerProps = {
children: React.ReactNode;
// swiperOptions: any;
};
export const SwiperContainerComp: React.FC<SwiperContainerProps> = ({
children,
// ...swiperOptions
}) => {
const swiperRef = useRef<SwiperContainer>(null);
useEffect(() => {
register();
if (!swiperRef.current) return;
const swiperEl = swiperRef.current;
const swiperParams = {};
Object.assign(swiperEl, swiperParams);
swiperEl.initialize();
}, []);
return (
<section className="h-full">
<swiper-container
style={{
width: '100%',
height: '100%',
}}
ref={swiperRef}
init={false}
>
{Children.map(children, (child) => (
<swiper-slide
style={{
width: '100%',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
>
{child}
</swiper-slide>
))}
</swiper-container>
<ArrowLeftCircle
className="swiper-button swiper-button-prev"
onClick={() => swiperRef.current?.swiper.slidePrev()}
/>
<ArrowRightCircle
className="swiper-button swiper-button-next"
onClick={() => swiperRef.current?.swiper.slideNext()}
/>
</section>
);
};