프론트엔드✏️/개인공부

[react-slick] 페이지 번호, 커스텀 화살표

당근먹는하니 2022. 10. 21. 16:10
728x90
반응형
import { useState } from "react";

// img
import { ReactComponent as NavArrowRightIcon } from "../../../assets/svg/ic_nav_arrow_right.svg";
import { ReactComponent as NavArrowLeftIcon } from "../../../assets/svg/ic_nav_arrow_left.svg";

최상단 import 부분

 

const images = [
  "https://i.ytimg.com/vi/i2i0uzo92gE/maxresdefault.jpg",
  "https://i.ytimg.com/vi/6rTljE9sd68/maxresdefault.jpg",
];

function NextArrow(props: any) {
  const { onClick } = props;
  return (
    <S.Arrow className={`right`} onClick={onClick}>
      <NavArrowRightIcon />
    </S.Arrow>
  );
}

function PrevArrow(props: any) {
  const { onClick } = props;
  return (
    <S.Arrow className="left" onClick={onClick}>
      <NavArrowLeftIcon />
    </S.Arrow>
  );
}

지금은 받아오는 데이터가 없어서 임의로 이미지 배열을 만들었다.

이미지 배열과 화살표들, svg 이미지를 컴포넌트로 받아와서 넣었다.

 

const [slideState, setSlideState] = useState({
    activeSlide: 0,
    activeSlide2: 0,
  });
  const settings = {
    dots: true,
    infinite: true,
    speed: 500,
    slidesToShow: 1,
    slidesToScroll: 1,
    beforeChange: (current: number, next: number) =>
      setSlideState({ activeSlide: next, activeSlide2: current }),
    nextArrow: <NextArrow />,
    prevArrow: <PrevArrow />,
  };

react-slick 설정하는 부분 

beforeChange 부분이 페이지 번호 처리하는 것의 핵심!

nextArrow, prevArrow는 위에 썼던 걸 그대로 넣어준다.

 

          <S.SliderText>
            스크린샷 {slideState.activeSlide + 1}/{images.length}
          </S.SliderText>
          <S.MySlider {...settings}>
            {images?.map((image) => (
              <div>
                <S.SliderImg src={image} />
              </div>
            ))}
          </S.MySlider>

밑에 JSX 작성 부분

 

 

// styles.ts 

export const SliderImg = styled.img`
  position: relative; 
  // Arrow 위치 잡기 위해선 relative여야 한다. 
  width: 965px;
  height: 520px;
  border-radius: 4px;
`;

export const Arrow = styled.p`
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  background-color: gray;
  color: #fff;
  width: 48px;
  height: 48px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  border-radius: 50%;
  transition: all 0.3s;
  z-index: 1; 
  // 화살표가 뒤에 묻히길래 z-index 주었다. 

  &.left { 
  // &를 붙여야 한다! 
    left: -34px;
  }

  &.right {
    right: -34px;
  }
`;

728x90
반응형