Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 프로그래머스 프론트엔드 데브코스
- SCSS use
- 이벤트 수식어
- 고양이 사진 검색기
- vue mixin
- flex
- 폼 입력 바인딩
- 리액트
- KDT 프로그래머스 데브코스 프론트엔드
- 프로그래머스 데브코스
- Spacer
- vuex map
- netlify redirect
- SCSS forward
- react next
- 쌓임맥락
- 리스트 렌더링
- 다른컴퓨터에서 git사용
- intersection opserver
- SCSS import
- 프로그래머스 K_Digital Training
- nextjs사용법
- KDT 프로그래머스
- Vue
- vue 이벤트 수신
- 프로그래머스 데브코스 프론트엔드
- vue 지역 컴포넌트
- SCSS extend
- git 같은계정 다른 컴퓨터
- postcss
Archives
- Today
- Total
혼자 적어보는 노트
[React] 클릭 시 원하는 컴포넌트로 스크롤 이동 본문
상세 페이지의 Sidebar에 댓글 아이콘을 누를 경우
상세페이지 하단의 댓글 컴포넌트로 화면을 이동시키는 리모콘 기능을 구현하기로 했다.
useMoveScroll hook 작성
function useMoveScroll(element: HTMLElement | null) {
const onMoveToElement = () => {
element?.scrollIntoView({ behavior: 'smooth', block: 'start' });
};
return { onMoveToElement };
}
이번에 처음 알게된 API인데
해당 element로 스크롤을 이동시켜준다.
behavior으로 애니메이션을 정의할 수 있고 block, inline 옵션으로 수직/수평 정렬을 정의할 수 있다.
element.scrollIntoView(true);로 설정 시 바로 지정한 element의 상단으로 이동시킬 수 있다.
const Sidebar = () => {
// 코드 생략
const { onMoveToElement } = useMoveScroll(document.getElementById('comment'));
return(
<SideButton onClick={onMoveToElement}>
<Icon name="commentRound" size={32} />
</SideButton>
)
}
comment 컴포넌트의 id에 'comment'을 적어주고
해당 element를 직접 지정하여 useMoveScroll에 넣어주었다.
useMoveScroll을 comment컴포넌트와 sideber컴포넌트의 부모 컴포넌트에 위치시킨다면
useRef로도 제어가 가능하다.
++
❗ 문제상황
Sidebar 컴포넌트가 렌더링 될 때는 Comment 컴포넌트가 렌더링이 되지 않아서
document.getElementById('comment')이 null인 상태이기 때문에
Sidbar가 리렌더가 되야만 click이벤트가 제대로 적용이 되는 문제가 생겼다.
✅ 문제 해결
클릭을 할 때 element를 찾을 수 있도록 매개변수를 id로 받아서 처리했다.
import { useCallback } from 'react';
function useMoveScroll(id: string) {
const onMoveToElement = useCallback(() => {
if (typeof window !== 'undefined') {
const element = document.getElementById(id);
element?.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
}, [id]);
return { onMoveToElement };
}
export default useMoveScroll;
'React' 카테고리의 다른 글
불필요한 useEffect 제거하기 (0) | 2023.08.15 |
---|---|
[React] useEffect, useLayoutEffect (0) | 2022.09.27 |
[React] Emotion CSS 사용 (0) | 2022.07.10 |
[React] 아이폰 HEIC 이미지 JPEG로 변환 (0) | 2022.07.08 |
[React] 이미지 업로드 시 이미지 압축 (0) | 2022.07.06 |
Comments