사이드 프로젝트를 진행하면서 정보 입력하는 화면이 필요했고, 입력폼 컴포넌트의 화면 구성을 typeform 의 입력창을 모방려고 했습니다. full page scroll 기능을 직접 구현하거나 라이브러리를 가져와 사용해야 하는데 일단 가장 유명하다고 할 수 있는 fullpage.js를 사용해보기로 했습니다.
function App() {
return (
<StepScroll>
<Page>
<FirstCustomComponent />
</Page>
<Page>
<SecondCustomComponent />
</Page>
<Page>
<ThirdCustomComponent />
</Page>
</StepScroll>
);
}
브라우저 화면 | 반응형 화면 |
---|---|
![]() | ![]() |
function FirstCustomComponent() {
const {
currentPage,
resetCurrent,
hasNextPage,
hasPrevPage,
nextPage,
prevPage,
movePage,
} = useStepScroll();
return (
<div>
{hasPrevPage && <button onClick={prevPage}>Prev</button>}
{hasNextPage && <button onClick={nextPage}>Next</button>}
</div>
);
}
useImperativeHandle
훅을 사용해 외부로 노출시키고자 하는 내부함수를 노출시켰습니다. function App() {
const ref = useRef<HandleScroll>(null);
return (
<>
<StepScroll ref={ref}>
<StepScroll.Page>
<FirstCustomComponent />
</StepScroll.Page>
<StepScroll.Page>
<SecondCustomComponent />
</StepScroll.Page>
<StepScroll.Page>
<ThirdCustomComponent />
</StepScroll.Page>
</StepScroll>
<button
onClick={() => {
ref.current.nextPage();
}}
>
Next Page
</button>
<button
onClick={() => {
ref.current.prevPage();
}}
>
Prev Page
</button>
<button
onClick={() => {
ref.current.movePage(2);
}}
>
Move to 2page
</button>
<button
onClick={() => {
ref.current.resetCurrentPage();
}}
>
To the first screen
</button>
</>
);
}
fullpage-scroll-component
에서 구현에 사용하기로 한 핵심 로직은 Dom API의 scrollIntoView
메소드인데 이 메소드가 호환하지 못하는 브라우저가 있는지 살펴봐야 했습니다....package.json
"exports": {
".": {
"require": {
"types": "./dist/index.d.ts",
"default": "./dist/index.cjs"
},
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.mjs"
}
}
},
마우스 스크롤과 터치 스크롤의 방향을 나타내는 훅, 스크롤에 반응하는 시간을 설정하는 delay, 등 고민해야 하는 부분이 많았는데 어디까지의 설정을 사용자에게 허락할 것인지에 대한 고민이 많았습니다.
사용자가 delay를 1000000 처럼 큰 단위를 줄 수도 있는 상황이었고 특정 페이지로 이동하는 메소드인 movePage에 인자로 이동 불가한 숫자를 부여할 수도 있는 상황이었습니다.
이러한 이유로 특정 프로퍼티에 대해서 정해진 값을 선택할 수 있는 옵션을 부여하기도 했습니다.
npm 배포를 생각해서 만든 오픈소스 라이브러리이기 때문에 인터페이스에 대한 고민이 필요했고 각 프랍스들에 대한 주석 설명 또한 필요했습니다.
좀 더 직관적인 프로퍼티, 메소드 이름을 정하는 것이 중요했습니다. 개인적인 예상과 실제 사용하는 사용자의 이해가 매우 다를 수 있음을 동료들을 통해 알게됐습니다.
인생 최초로 npm에 그럴싸한 라이브러리를 배포했습니다. 오픈소스의 도움을 받기만하다가 다른 사람을 위해 라이브러리를 만들 수 있는 아이디어와 기회를 얻게 됐고 생각보다 좋은 반응을 얻을 수 있어 뜻깊은 시간이었습니다.