티스토리 뷰
Typescript에서 useRef를 사용할 때에는 용도에 따라서 타입지정이 달라지게 되는데 크게 두 가지로 나눌 수 있다.
1. 값 저장 용도 (current 객체 자체를 수정하기 위함)
: useRef를 로컬 변수 용도로 사용하는 경우이다.
- 제네릭: 값의 타입을 넣어준다.
- 초기값: 타입에 맞는 초기값을 할당해준다.
const count = useRef<number>(0);
const text = useRef<string>("")
2. DOM 취득 용도
- 제네릭: 참조하는 HTML 엘리먼트를 넣어준다.
- 초기값: null을 넣어준다.
// DOM button 참조: 제네릭으로 html엘리먼트(button) 설정. 초기값은 null로 설정
const buttonRef = useRef<HTMLButtonElement>(null);
// DOM input 참조 : 제네릭으로 html엘리먼트(input) 설정
const inputRef = useRef<HTMLInputElement>(null);
useRef - ref 객체 타입
1. 값 저장 용도: ref객체.current의 값을 수정 가능
React.MutableRefObject<제네릭>
2. DOM 취득 용도
ref 객체는 React.RefObject<제네릭> 타입이 되며, ref.current(참조하는 DOM)값 자체는 수정 불가
단, ref.current.속성(DOM객체.속성)은 수정이 가능하다.
Q. useRef는 수정 불가능한 RefObject<T>를 반환하는데, 왜 inputRef.current.value는 수정이 가능할까?
A. 정의상 current 프로퍼티만 readonly로, current 프로퍼티의 하위 프로퍼티인 value는 여전히 수정 가능하다.
readonly가 shallow하기 때문이다.
React.RefObject<HTMLButtonElement>
React.RefObject<HTMLInputElement>
결론
1번의 예시가 잘 와닿지 않아 찾아보니 useRef로 컴포넌트 안의 변수를 만들면 리렌더링을 발생하지 않고 초기화되지 않는 값을 관리할 수 있다고 한다.(heap 영역에 저장되는 일반적인 JS객체이기 때문에 react가 변경사항을 감지할 수 없다)
- 사용예시: setTimeout, setInterval의 id, 외부 라이브러리를 사용하여 생성된 인스턴스 scroll 위치 등 그냥 순수 JS로 렌더링마다 초기화되지 않는 변수가 필요할 때 사용하면 될 듯하다.
내가 주로 react 에서 useRef를 사용했던 상황은 주로 돔 요소를 가져와 focus를 주는 등.. 이 경우는 2번에 해당한다.
비제어 컴포넌트는 역시 2번을 활용하는 거 같다.
기능 | 제어 컴포넌트 | 비제어 컴포넌트 |
일회성 정보 검색 (예: 제출) | O | O |
제출 시 값 검증 | O | O |
실시간으로 필드값의 유효성 검사 | O | X |
조건부로 제출 버튼 비활성화 (disabled) | O | X |
실시간으로 입력 형식 적용하기 (숫자만 가능하게 등) | O | X |
동적 입력 | O | X |
all ref:
'Frontend > TypeScript' 카테고리의 다른 글
[TypeScript] 다형성(polymorphism)과 제네릭 (0) | 2023.05.02 |
---|---|
[Typescript] React.FC를 사용하지 않아야 하는 이유(+ 리액트 컴포넌트 네임 스페이스 패턴) (0) | 2023.03.26 |
[TypeScript | styled-components] 스타일드 컴포넌트 사용하기 (0) | 2023.03.05 |
[TypeScript] 타입스크립트 자동완성과 DT, TS (0) | 2023.01.14 |
[TypeScript] Promise와 Awaited 분석 (0) | 2023.01.09 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 프리온보딩 프론트엔드 챌린지 3월
- float 레이아웃
- 원티드 프리온보딩 FE 챌린지
- getStaticPaths
- text input pattern
- 원티드 프리온보딩 프론트엔드 챌린지 3일차
- is()
- 타입스크립트 장점
- 원티드 FE 프리온보딩 챌린지
- ~ ^
- && 셸 명령어
- nvm경로 오류
- 항해99프론트
- 원티드 3월 프론트엔드 챌린지
- D 플래그
- getServerSideProps
- grid flex
- 타입스크립트 DT
- 항해99추천비추천
- 항해99프론트후기
- fs모듈 넥스트
- 부트캠프항해
- nvm 설치순서
- reactAPI
- 틸드와 캐럿
- 프리렌더링확인법
- 형제 요소 선택자
- Prittier
- aspect-ratio
- tilde caret
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함