📚 이론정리/React & Next.js
✏️ useState와 useRef의 차이점
서카츄
2024. 1. 18. 16:55
useState
컴포넌트 렌더링을하며 상태 값을 관리하고, 상태가 변경될때마다 컴포넌트가 리렌더링 하는 과정을 거침
함수를 호출할때마다 컴포넌트가 계속~~ 그려지고 새로운 상태값이 반영된다.
useRef
컴포넌트 렌더링과 관련 없이 값을 유지하고싶을때, 값이 변경된다해도 컴포넌트가 리렌더링 되지 않음
current속성을 통해 접근한다해도, 값은 변경된다하지만 컴포넌트는 리렌더링 되지않음 -> 이전값을 기억할 수 있음
설정된 ref값은 컴포넌트가 계속해서 렌더링되어도 계속 유지함 (언마운트 전까지) -> ref의 값 변화가 일어나도 렌더링으로 인해 내부변수들이 초기화 되는것을 막아줌.
ex) 컴포넌트가 100번 렌더링되었다 -> ref에 저장된 값은 유지된다.
결국은 함수 컴포넌트에서 값이 변경되더라도 렌더링을 유지해야할때 사용한다.
DOM요소에 접근할때도 사용함
정리하면 state는 리렌더링 될때 , 꼭 필요한 값을 다룰때 쓰면 좋고
ref는 리렌더링을 발생시키지 않는 값을 저장할때 사용한다. (내부로 안보일때 사용가능)
ref는 객체니까 Ref.current를 적어줘야한다.
input을 관리할때 값 자체는 useState를 통해 관리하지만 (폼제출할때)
input으로 직접 접근하려고 할때는 useRef속성을 사용한다.
import React, { useState, useRef } from 'react';
function App() {
// useState를 사용하여 상태값 관리
const [inputValue, setInputValue] = useState('');
// useRef를 사용하여 이전 입력값을 기억
const inputValueRef = useRef({ value: '' });
// 입력값이 변경될때마다 호출함
const handleChange = (event) => {
const newValue = event.target.value;
setInputValue(newValue);
};
// 폼 제출할때 호출됨
const handleSubmit = (event) => {
event.preventDefault();
// 현재 입력값을 useRef를 통해 저장
inputValueRef.current.value = inputValue;
// 이전 입력값을 useRef를 통해 가져와서 출력
alert(`useRef의 값: ${inputValueRef.current.value}`);
// 입력값 초기화
setInputValue('');
};
return (
<>
<form onSubmit={handleSubmit}>
{/* useState를 사용함 */}
<input type="text" value={inputValue} onChange={handleChange} />
{/* useRef를 사용해서 이전 입력값을 저장 */}
<input type="hidden" ref={inputValueRef} />
<button type="submit">제출하기</button>
</form>
{/* 현재 입력값 출력 */}
<p>값은: {inputValue}</p>
<p>useRef의 값: {inputValueRef.current.value}</p>
</>
);
}
export default App;