티스토리 뷰

# ref?

HTML 에서 id 를 사용하여 DOM 에 이름을 다는것처럼 리액트 프로젝트 내부에서 DOM에 이름을 다는방법이 있다. 이것이 바로 ref(reference 줄임말) 개념이다.

 

리액트 컴포넌트 안에서는 id를 사용하면 안되나요?
👉 리액트 컴포넌트 안에서도 id 사용할수 있습니다. JSX 안에서 DOM에 id를 달면 해당 DOM을 렌더링할 때 그대로 전달합니다.
하지만 특수한 경우가 아니면 권장하지는 않습니다. ref는 전역적으로 작동하지 않고 컴포넌트 내부에서만 작동하기 때문에 문제는 생기지 않습니다. 

# 그럼 ref는 어떤 상황에서 사용해야 할까?

 정답은 'DOM을 꼭 직접적으로 건드려야 할 때' 입니다. 예를 들어, 일반 순수 자바스크립트로 및 jQuery로 만든 웹 사이트에서 input을 검증 할 때는 다음과 같이 특정 id를 가진 input 에 클래스를 설정할때 사용합니다.

 

import {Component} from 'react';
import './ValidationSample.css';

class ValidationSample extends Component {
	state = {
    	passwrod : ''.
        clicked : false,
        vaildated : false
        }
    handleChange = (e) => {
    	this.setState({
        	password : e.target.value
            });
          }
    handleButtonClick = () => {
    	this.setState({
        	clicked : true,
            validated : this.state.password === '0000'
            });
          }
    render() {
    	return(
        <div>
        <input type = "password"
        value = {this.state.password}
        onChange = {this.handleChange}
        className = {this.state.clicked ? (this.state.validated ? 'success' : 'failure' : ''}
        />
        	<button onClick = {this.handleButtonClick}>검증하기</button>
        </div>
        );
       }
      }
      export default VaildationSample;

👉 input 에서는 onChange 이벤트가 발생하면 handleChange 를 호출하여 state 의 password 값을 업데이트 합니다.

button 에서는 onClick 이벤트가 발생시 handleButtonClick 을 호출해 clicked 값을 참으로 설정 후 vaildated 값을 검증 결과로 설정 합니다. input 의 className 값은 버튼을 누르기 전에는 비어 있는 문자열을 전달하며, 버튼을 누른 후에는 검증 결과에 따라 success / failure 값을 설정합니다. 이 값에 따라 빨간색 / 초록색을 나타냅니다.

# DOM을 꼭 사용해야 하는 상황

state를 사용하여 우리에게 필요한 기능을 구현했지만, 가끔 state 만으로 해결할 수 없는 기능이 있습니다.

  • 특정 input에 포커스 주기
  • 스크롤 박스 조작하기
  • Canvas 요소에 그림 그리기 등

이런 경우에는 DOM에 직접적으로 접근해야하는데, 이를 위해 ref 를 사용합니다.

 

# 콜백 함수를 통한 ref 설정

ref를 만드는 가장 기본적인 방법은 콜백 함수를 사용하는 것입니다. ref를 달고자 하는 요소에 ref 라는 콜백 함수를 props로 전달해 주면 됩니다. 이 콜백 함수는 파라미터로 전달받고, 파라미터로 받은 ref는 컴포넌트의 멤버 변수로 설정해줍니다.

<input ref= {(ref) => {this.input=ref}} />

👉 이렇게 하면 this.input 은 input 요소의 DOM을 가리킵니다. ref 의 이름은 원하는 것으로 자유롭게 저장 할 수 있습니다.

# createRef를 통한 ref 설정

ref를 만드는 또 다른 방법은 리액트를 내장되어 있는 createRef 라는 함수를 사용하는 것 입니다. 이 함수를 사용해서 만들면 더 적은 코드를 쉽게 사용 할 수 있습니다. 

import {Component} from 'react';

class RefSample extends Component {
	input = React.createRef();
    
    handleFocus = () => {
     this.input.current.focus();
    }
    render() {
    	return (
        	<div>
            	<input ref = {this.input} />
            </div>
          };
         }
       }

👉 createRef를 사용하여 ref를 만들려면 우선 컴포넌트 내부에서 멤버 변수로 React.createRef() 를 담아 주어야합니다. 그리고 멤버 변수를 ref 를 달고자 하는 요소에 ref props 로 넣어주면 ref 설정이 완료됩니다.

설정한 뒤 나중에 ref 설정 해 준 DOM 에 접근 시 this.input.current를 조회하면 됩니다. 콜백 함수와 다른점은 뒷부분에 .current 를 넣어주어야 합니다.

 

# 컴포넌트에 ref 달기

리액트에서는 컴포넌트에도 ref 를 달 수 있습니다. 이 방법은 주로 컴포넌트 내부에 있는 DOM 을 컴포넌트 외부에서 사용할 때 씁니다.

방법은 DOM에 ref 를 다는 방법과 같습니다.

<MyComponent
	ref = {(ref) => {this.myComponent=ref}}
/>

# 정리

컴포넌트 내부에서 DOM 을 직접 접근할 때는 ref 사용

주의사항으로는 ref를 먼저 사용하지 말고, 원하는 기능을 구현 할 수 있는지 반드시 확인하고 사용하자!

예를 들면, 서로 다른 컴포넌트끼리 데이터를 교류할때 ref 를 사용한다면 그것은 잘못된것입니다.

 

컴포넌트끼리 데이터를 교류할 시에는. 언제나 데이터를 부모 - 자식 관계 흐름으로 이어가야합니다.

함수 컴포넌트에선 useRef 라는 Hook 함수를 사용합니다. React.createRef 와 매우 유사합니다.

 

 

'FrontEnd > React' 카테고리의 다른 글

7장. 컴포넌트의 라이프사이클 메서드  (0) 2023.03.11
6장. 컴포넌트 반복  (2) 2023.03.03
4장. 이벤트 핸들링  (0) 2023.02.11
3장. 컴포넌트  (0) 2022.12.28
2장. JSX  (0) 2022.12.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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