안녕하세요
9월08일77일차 - 리액트 슬릭 슬라이더 본문
src 폴더에 component, pages 폴더를 만들어 이용하는 것이 관습입니다.
리액트 슬라이더 만들기
react slick 을 설치합니다. (https://www.npmjs.com/package/react-slick)
npm install react-slick --save
npm install slick-carousel
package.json 의 dependencies에 설치된 것을 확인할 수 있습니다.
"react-slick": "^0.29.0",
"slick-carousel": "^1.8.1",
파일을 import 해줍니다.
import Slider from "react-slick";
import "slick-carousel/slick/slick.css";
슬라이더 component를 만듭니다.
const MainSlider = () => {
return <div>main slider</div>;
};
export default MainSlider;
Slider 태그 안에 슬라이드를 넣어줍니다.
return (
<Slider>
<li>01</li>
<li>02</li>
<li>03</li>
</Slider>
);
슬라이드에 필요한 정보를 객체로 만듭니다.
const SLIDE = [
{ slideId: 1, content: "01 슬라이드 제목", des: "01 슬라이드 내용", link: "/1", },
{ slideId: 2, content: "02 슬라이드 제목", des: "02 슬라이드 내용", link: "/2", },
{ slideId: 3, content: "03 슬라이드 제목", des: "03 슬라이드 내용", link: "/3", },
];
슬라이드 데이터를 Slider에 넣습니다.
const MainSlider = () => {
return (
<Slider>
{SLIDE.map((slide, idx) => (
<figure className={`item0${slide.slideId}`}>
<div className="slide-box">
<h2>{slide.content}</h2>
<p>{slide.des}</p>
<a href={slide.link}>more</a>
</div>
</figure>
))}
</Slider>
);
};
슬라이드 설정을 만듭니다.
const MainSlider = () => {
const slideSet = {
dots: false, // 버튼을 없앱니다.
arrows: false, // 화살표를 없앱니다.
afterChange: (index) => console.log(index), // afterChange로 index를 가져옵니다.
};
return (
<>
<Slider {...slideSet}> // slideSet을 Slider 태그에 스프레드합니다.
슬라이드 번호를 만들어 줍니다.
우선 useState로 변수를 만듭니다.
import { useState } from "react";
setNum(index)로 num의 값을 슬라이드의 index로 바꿔줍니다.
const [num, setNum] = useState(0);
const slideSet = {
afterChange: (index) => setNum(index),
};
num을 이용해 현재 슬라이드 번호를 주고, SLIDE.length로 최대 슬라이드 번호를 적어줍니다.
<div> 0{num + 1} / 0{SLIDE.length} </div>
슬라이드 버튼을 만듭니다.
우선 useRef로 SLIDE를 선택할 수 있도록 합니다.
import { useRef, useState } from "react";
const MainSlider = () => {
const slideRef = useRef();
Slider태그에 ref={slideRef} ref를 전달합니다.
<Slider {...slideSet} ref={slideRef}>
버튼에 click 이벤트를 주고, slideRef.current.slickPrev()로 버튼 이벤트를 만들어줍니다.
<div className="arrows">
<button onClick={() => slideRef.current.slickPrev()}>prev</button>
<button onClick={() => slideRef.current.slickNext()}>next</button>
</div>
슬라이드 번호 버튼을 만듭니다.
<ul className="dots">
{SLIDE.map((dots, idx) => (
<li
className={idx === num ? "on" : ""} // idx가 num과 같은 슬라이드에는 on을 붙입니다.
onClick={() => slideRef.current.slickGoTo(idx)} // 클릭 이벤트를 주고 slideRef.current.slickGoTo(idx)로 클릭한 슬라이드 idx로 이동하도록 만듭니다.
key={dots.slideId} // key={dots.slideId}로 key를 줍니다.
>
{dots.slideId} // 숫자 1,2,3을 li에 담아 넣습니다.
</li>
))}
</ul>
fiugre에도 className={idx === num ? "on" : ""} // idx가 num과 같은 슬라이드에는 on을 붙입니다.
<figure className={`item0${slide.slideId} ${idx === num ? "on" : "" }`}>
새로고침을 하면 on이 붙지 않은 채로 새로고침 됩니다. 초기값을 useEffect를 사용하여 정해줍니다.
useEffect는 보통 데이터를 가져올 때나, 최초에 한 번 실행해야하는 경우에 사용합니다.
useEffect(()=>{}) : mount하면 최초에 실행하고, 페이지가 업데이트 될 때마다 다시 실행합니다.
useEffect(()=>{}, []) : mount하면 최초에 실행하고, []안의 값이 변할 때만 실행합니다.
useEffect(() => {
setNum(0); // 초기값을 0으로 설정합니다.
}, []); // 페이지를 로딩하고 단 한 번만 합니다.
react에서 image는 public폴더에 넣습니다.
'프론트엔드 국비교육' 카테고리의 다른 글
9월15일80일차 - 리액트 슬릭 useRef로 버튼만들기 (0) | 2022.09.15 |
---|---|
9월13일78일차 - 리액트 슬릭 (0) | 2022.09.15 |
9월07일76일차 - 깃허브로 리액트 배포, 다단메뉴, 토글 (0) | 2022.09.07 |
화면을 덮는 팝업창 + 쿠키 만들기 (0) | 2022.09.05 |
8월26일70일차 - react 활용 주간(4) - 리액트 슬릭 (0) | 2022.08.26 |