ref
를 이해하려면 먼저 DOM
을 완벽히 이해해야 한다.
DOM
을 이해하려면 렌더링을 이해해야 한다!!
렌더링
웹 브라우저가 html을 해석하여 결과를 화면에 보여주는 과정
DOM
웹 브라우저가 HTML를 해석하는 과정에서 HTML 요소들을 트리형태로 구조화해서 표현하는 문서
ref(reference)
JS에서 특정
DOM
요소에 이름을 달 때는 보통id
를 사용한다.
그러나 react component id는 unique 해야하기 때문에 사용을 권장하지 않는다.
state
로 해결 불가능하고DOM
에 직접적으로 접근해야할 때 사용한다.
ex) 특정input
에 포커스 주기,scroll
위치 조정,Canvas
요소에 그림 그리기 등
스크롤 위치 조정
ref
가js
에서id
와 같은 개념이고,DOM
을 가리킨다는 개념은 이해했다.
스크롤 위치 조정 메서드로 이해해보기 위해 책(Class Component
)와 다르게Function Component
+useRef
를 사용하여 스크롤을 맨 아래로 내리는 메서드를 만들었다.
import { useRef } from "react";
import styled from "styled-components";
function App() {
const scrollRef = useRef();
const handleScroll = () => {
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
};
return (
<>
<Container ref={scrollRef}>
<Box />
</Container>
<button onClick={() => handleScroll()}>맨밑</button>
</>
);
}
const Container = styled.div`
border: 1px solid #000;
height: 300px;
width: 300px;
overflow: auto;
position: relative;
`;
const Box = styled.div`
width: 100%;
height: 650px;
background: linear-gradient(#fff, #000);
`;
export default App;
작업을 하면서 생긴 문제점들
처음에 ScrollBox
컴포넌트를 따로 만들어 ref
를 줬는데, 함수컴포넌트에는 ref
를 사용할 수 없다, forwardRef
랑 헷갈린게 아니냐고 계속 오류를 띄웠다. forwardRef
는 상위->하위로 ref
를 전달할 때 사용하는 것으로, ScrollBox
하위에 있는 Container
의 ref
를 사용해야하는 내 상황에서는 사용할 필요가 없었다.
-> ScrollBox
안의 요소들을 꺼내 불필요한 ScrollBox
컴포넌트를 삭제하고 App
에 Container
와 Box
를 가져왔다.
ref
를 console.log
로 찍어보면 current:
형식의 객체가 나온다. 사용할 때 꼭 ref.current.
형식으로 사용해야한다.
scrollTop
과 scrollHeight
등 scroll
값을 가져오는 요소의 속성에 대한 이해가 부족했고 비슷한 이름의 scrollTo
등 헷갈릴 법한 것들에 대해 따로 정리할 예정이다.
처음 ref.current
등등 console.log
를 찍을 때 undefined
가 출력됐는데 당연하다.. Container
에 ref
를 주기 전이다. 렌더링 된 후엔 제대로 값이 출력된다.