Ref
Ref는 돔엘리먼트에 접근하기 위해 사용한다.
일반적으로 자식을 수정하려면 props를 전달해서 값이 변경되었을 때 다시 렌더링 한다.
하지만 직접 돔 요소를 선택해서 어떤 작업을 해야하는 경우도 생긴다.
Ref를 사용해야 할 때
- 포커스, 텍스트 선택영역, 혹은 미디어의 재생을 관리할 때.
- 애니메이션을 직접적으로 실행시킬 때.
- 서드 파티 DOM 라이브러리를 React와 같이 사용할 때.
Ref 불러오기
이후 예시는 함수 컴포넌트 기준으로 작성.
// 클래스 컴포넌트
import { createRef } from "react"
// 함수 컴포넌트
import { useRef } from "react"
비제어 컴포넌트에서 Ref 사용하기
폼을 만들 때, 일반적으로 제어 컴포넌트로 만들지만 Ref를 사용해 비제어 컴포넌트로 작성할 수 있다.
제어 컴포넌트에서는 input 등의 값을 state로 관리하고 업데이트 한다.
비제어 컴포넌트에서는 state로 폼 값을 제어하는 대신 DOM 자체에서 폼 데이터를 다룬다. ⇒ 그러기 위해서 Ref 를 사용한다. (ref를 사용해 DOM 요소를 연결한다)
useRef를 사용하면 useState처럼 값을 만들 수 있다.
값이 변경되어도 리렌더링을 하지 않기 때문에 불필용한 리렌더링이 필요하지 않을 때 자주 사용된다.
import { useRef } from "react"
// ref 를 활용 -> 비제어 컴포넌트로 폼을 다루자
export default function UncontrolledForm() {
const inputRef = useRef()
function handleSubmit(e) {
e.preventDefault()
alert(inputRef.current.value)
inputRef.current.focus()
}
return (
<form onSubmit={handleSubmit}>
<label>닉네임: </label>
<input type="text" name="nickname" ref={inputRef} />
<input type="submit" value="제출" />
</form>
)
}
폼 안에 텍스트 인풋이 하나 있고 제출 버튼이 있는 구조다. 제출 했을 때 handleSubmit
함수가 실행된다.
닉네임을 입력하는 input의 값을 state로 관리하지는 않지만, inputRef.current.value
처럼 ref를 이용해서 값에 접근할 수 있다.
그리고 제출 후 다시 인풋에 포커스를 놓기 위해 inputRef.current.focus()
이렇게 작성할 수 있다. 인풋에 포커스를 하려면 인풋 요소를 일단 선택해야 하는데 그 부분을 Ref사용으로 간단하게 처리할 수 있다.
Leave a comment