React의 ref는 DOM 요소나 React 컴포넌트에 대한 직접적인 참조를 생성하고 관리하는 데 사용되는 특별한 속성입니다.
ref는 DOM 조작이 필요한 특정 상황에서 활용되며, 대표적인 사용 사례는 다음과 같습니다.
- 포커스, 텍스트 선택 영역, 미디어 제어
- 애니메이션 실행
- 서드 파티 DOM 라이브러리와의 통합
이번 포스팅에서는 ref를 활용해 패스워드 검증 컴포넌트를 구현하는 과정을 살펴보겠습니다.
기능 요구사항
- 입력된 패스워드가 "0000"이면 입력창의 배경색을 파란색으로 변경.
- 입력된 패스워드가 틀리면 배경색을 빨간색으로 변경.
- 잘못된 경우 입력창에 포커스를 설정.
초기 코드: 클래스형 컴포넌트와 상태 관리
먼저 기본적인 컴포넌트를 작성합니다.
src 디렉터리 아래에 ref 디렉터리를 만들고, ValidatePassword.js 파일을 생성:
import { Component } from "react";
class ValidatePassword extends Component {
state = {
password: ''
};
changePassword = e => this.setState({ password: e.target.value });
render() {
return (
<>
<input type="password" value={this.state.password} onChange={this.changePassword} />
<button>패스워드 검증</button>
</>
);
}
}
export default ValidatePassword;
App.js 파일에 ValidatePassword 컴포넌트를 추가
import ValidatePassword from "./ref/ValidatePassword";
function App() {
return (
<ValidatePassword />
);
}
export default App;
입력값을 state로 관리하며, 버튼을 클릭하면 검증 로직을 수행합니다.
import { Component } from "react";
class ValidatePassword extends Component {
// 초기 상태 정의
state = {
password: '', // 입력된 패스워드 값
isValid: false // 패스워드 검증 결과
};
// 입력값을 업데이트하는 함수
changePassword = (e) => this.setState({ password: e.target.value });
// 패스워드를 검증하는 함수
checkValid = () => {
if (this.state.password === "0000") {
this.setState({ isValid: true }); // 검증 성공
} else {
this.setState({ isValid: false }); // 검증 실패
}
};
render() {
return (
<>
{/* 입력창과 상태에 따른 배경색 설정 */}
<input
type="password"
value={this.state.password}
onChange={this.changePassword}
style={this.state.isValid ? { backgroundColor: 'blue' } : { backgroundColor: 'red' }}
/>
<button onClick={this.checkValid}>패스워드 검증</button>
</>
);
}
}
export default ValidatePassword;
ref를 이용한 포커스 설정
ref를 사용하는 방법은 두가지가 있습니다. 간단한 형식은 아래와 같습니다.
React.createRef() API를 이용하는 방법 (리액트 16.3에서 추가, 사용 권장)
class MyComponent extends Component {
constructor(props) {
super(props);
this.myref = React.createRef(); ⇐ #1 생성자에 createRef() 함수의 호출 결과를 ref 변수에 설정
} → current 속성을 가진 객체를 반환
handler = () => this.myref.current.focus(); ⇐ #3 참조를 사용할 때 ⇒ ref변수명.current.DOM요소기능
render() {
return <input ref={this.myref} />; ⇐ #2 참조할 DOM 요소 또는 컴포넌트에 ref 속성을 추가
}
}
콜백 ref를 이용하는 방법
ref 속성에 React.createRef()를 통해 생성된 ref를 전달하는 대신, 함수를 전달
전달된 함수는 다른 곳에 저장되고 접근할 수 있는 리액트 컴포넌트의 인스턴스나 DOM 엘리먼트를 인자로 받음
<input ref={x => this.myref = x} />
~~~~~~~~~~
이 변수를 이용해서 <input> 요소를 직접 제어하는 것이 가능 ( 예: this.myref.focus() )
1. 콜백 ref를 이용하는 방법
콜백 ref는 함수 형태로 ref를 정의합니다. 이를 통해 입력창 DOM 요소를 직접 참조할 수 있습니다.
검증 실패 시 입력창에 포커스를 설정하도록 수정해봅시다.
import { Component } from "react";
class ValidatePassword extends Component {
// 초기 상태 정의
state = {
password: '',
isValid: false
};
// 입력값을 업데이트하는 함수
changePassword = (e) => this.setState({ password: e.target.value });
// 패스워드를 검증하는 함수
checkValid = () => {
if (this.state.password === "0000") {
this.setState({ isValid: true }); // 검증 성공
} else {
this.setState({ isValid: false }); // 검증 실패
this.myinput.focus(); // 입력창에 포커스 설정
}
};
render() {
return (
<>
{/* 콜백 ref를 사용하여 DOM 요소를 참조 */}
<input
ref={(x) => (this.myinput = x)}
type="password"
value={this.state.password}
onChange={this.changePassword}
style={this.state.isValid ? { backgroundColor: 'blue' } : { backgroundColor: 'red' }}
/>
<button onClick={this.checkValid}>패스워드 검증</button>
</>
);
}
}
export default ValidatePassword;
2. React.createRef()를 이용하는 방법
React 16.3 이상에서는 React.createRef()를 사용해 보다 간결하게 ref를 설정할 수 있습니다.
다음은 동일한 기능을 createRef로 구현한 예제입니다.
import { Component, createRef } from "react";
class ValidatePassword extends Component {
constructor(props) {
super(props);
// createRef()를 사용해 ref 생성
this.myinput = createRef();
}
state = {
password: '',
isValid: false
};
// 입력값을 업데이트하는 함수
changePassword = (e) => this.setState({ password: e.target.value });
// 패스워드를 검증하는 함수
checkValid = () => {
if (this.state.password === "0000") {
this.setState({ isValid: true }); // 검증 성공
} else {
this.setState({ isValid: false }); // 검증 실패
this.myinput.current.focus(); // 입력창에 포커스 설정
}
};
render() {
return (
<>
{/* createRef()를 사용하여 DOM 요소를 참조 */}
<input
ref={this.myinput}
type="password"
value={this.state.password}
onChange={this.changePassword}
style={this.state.isValid ? { backgroundColor: 'blue' } : { backgroundColor: 'red' }}
/>
<button onClick={this.checkValid}>패스워드 검증</button>
</>
);
}
}
export default ValidatePassword;
비교: 콜백 ref vs. React.createRef()
특징 | 콜백 ref | React. createRef() |
선언 방식 | 함수 형태로 정의 | 클래스 생성자에서 createRef() 호출 |
유연성 | 다양한 동작 추가 가능 | 기본적으로 DOM 요소 참조에 최적화 |
사용 가능 시점 | 렌더링 직후 설정 가능 | 렌더링 중에 ref를 정의 |
코드 가독성 | 비교적 복잡한 구조 | 간결하고 읽기 쉬움 |
*생성형 AI 활용한 클라우드&보안 전문가 양성캠프 과정의 교육내용 정리 자료입니다.
'코딩 > 리액트' 카테고리의 다른 글
[새싹 성동 2기] React 컴포넌트 라이프사이클과 메서드 활용하기 (1) | 2024.11.19 |
---|---|
[새싹 성동 2기]React에서 스크롤 박스 구현하기 (0) | 2024.11.19 |
[새싹 성동 2기] 상태 내리기와 상태 올리기(state) (0) | 2024.11.19 |
[새싹 성동 2기] 리액트 이벤트 핸들링 사용법과 예시 (2) | 2024.11.19 |
[새싹 성동 2기] 리액트 상태(state) 에 대하여 (1) | 2024.11.19 |