[React] react-slick 사용시 옵션 적용이 안될 때

date
Mar 9, 2023
slug
react-slick-사용시-옵션-적용이-안될-때
category
Dev
status
Public
tags
Next.js
Front-end
React
keywords
summary
next.js, react 환경에서 react-slick으로 슬라이드 구현하려는데 row가 안바뀔 때
type
Post
Last updated
Mar 10, 2023 01:17 AM
Created time
Mar 10, 2023 12:58 AM
현재 상황
// ...import

const SlideWrapper: React.FC = ({ children }) => {
	const settings = {
		arrows: false,
		rows: 3,
		slidesPerRow: 2,
		// ... 
	}

	return (
		<Slider
			{...settings}
		>
			{children}
		</Slider>
	)
}

const Item = () => {
	return (
		<div>label</div>
	)
}

const Component = () => {
	const items = [1, 2]

	return (
		<SlideWrapper>
			{items.map((item) => (<Item key={item} />))}
		</SlideWrapper>
	)
}
위와 같이 react-slick의 children을 부모로부터 map으로 돌려서 사용하면, settings로 넘겨준 옵션들이 적용되지 않는 현상이 있다.
 
삽질
next.js로 ssr 가능하게 구현해서 그런가?
→ dynamic import로 csr되도록 해봤지만 똑같았다.
불필요한 css가 오버라이딩 되었나?
→ 개발자 도구로 확인해본 결과 그런 속성은 부여되지 않았다.
음.. 뭐때문일까? codesandbox에서 기초 예제에서 여러가지 시도해보자
→ react-slick 하위로 <div /> 등 블록을 바로 사용하지 않고, 특정 컴포넌트를 반복문을 통해 배열로 넘겨주면 재현되었다.
// 재현 x
<Slider>
{[
	<div />,
	<div />
]}
</Slider>

// 재현 o
<Slider>
	{
		[1, 2].map(() => (<Component key={key} />))}
	}
</Slider>
 
원인
원인은 바로 react-slick의 속성 부여 원리에 있었다.
react-slick은 내부적으로 속성에 대해 children에게 필요로하는 props를 부여하는데, 별도로 컴포넌트를 정의해서 map을 돌리면 react-slick에서 의도한 props 전달이 되지 않기 때문
 
해결
위 코드를 기준으로 아래와 같이 수정하면 정상적으로 옵션이 잘 적용된다.
<Slider>
	{
		[1, 2].map((key) => (
			<div key={key}>
				<Component />
			</div>
		)}
	}
</Slider>
 
 
참고 자료