2022. 11. 4. 22:15
# useScroll의 기능
import {useEffect, useState} from "react";
export const useScroll = () => {
const [state, setState] = useState({
x: 0,
y: 0
});
const onScroll = () => {
setState({ y: window.scrollY, x: window.screenX });
};
useEffect(() => {
window.addEventListener("scroll", onScroll);
return () => window.removeEventListener("scroll", onScroll);
}, []);
return state;
};
useScroll은 스크롤의 위치를 감지하여 확인할 수 있는 hook이다.
반환값은 { x : 0(위치) , y : 0(위치) }로 각 스크롤의 x와 y값을 반환한다.
# 설명
const [state, setState] = useState({
x: 0,
y: 0
});
useState를 사용해서 객체리터럴 x와 y를 만들고 x에는 x좌표의 스크롤위치와
y에는 y좌표 스크롤 위치를 불러올 것이다.
const onScroll = () => {
setState({ y: window.scrollY, x: window.screenX });
};
onScroll함수를 만들어주고 setState에 y = y스크롤위치, x = x스크롤위치를 넣어주는 기능을 넣어준다.
useEffect(() => {
window.addEventListener("scroll", onScroll);
return () => window.removeEventListener("scroll", onScroll);
}, []);
return state;
useEffect를 사용하여 이벤트 리스너를 걸어준다.
window에서 스크롤되면 onScroll함수를 실행시킨다.
스크롤이 될때마다 onScroll가 실행되고 onScroll 내부에서는 setState를 변환시켜주기 때문에
state의 값을 계속해서 re-render를 시켜준다.
그리고 컴포넌트가 보이지 않을때는 이벤트를 삭제 해준다.
# 사용예시
const { y } = useScroll();
<div className="App" style={{ height: "1000vh" }}>
<h1 style={{ position: "fixed", color: y > 100 ? "red" : "blue" }}>hi</h1>
</div>
구조분해할당을 사용하여 useScroll에서 y를 가져온다.
이 후에 style.color에 y가 100보다 크면 "red" 색상이 되고, 적으면 "blue"색상이 되도록 만들었다.
결과 : 스크롤을 내리면 red가 되고 가장위로 올리면 blue가 된다.
'Frontend > React-Hooks' 카테고리의 다른 글
[ React Hook ] 8. useFullscreen (0) | 2022.11.09 |
---|---|
[ React Hook ] 7. useFadeIn (0) | 2022.11.05 |
[ React Hook ] 5. useNetwork (0) | 2022.11.03 |
[ React Hook ] 4. usePreventLeave (0) | 2022.11.02 |
[ React Hook ] 3. useTabs (0) | 2022.10.31 |