리액트에서 자주 변경되고, 변경된 값이 화면에 출력돼야하는 값이 필요할 때 state를 활용할 수 있다.
useState
react hook 이라고 한다. 이 개념은 추후 자세히 알아볼 예정!
const test = useState("초기값");
// test:
[
변수: "변수값",
변수를 변경할 수 있는 함수: function() {},
]
// 따라서 아래와같이 사용할 수 있음 (Destructuring)
const [name, setName] = useState('Kim');
제어 컴포넌트
import { useState } from "react";
const App = () => {
const [value, setValue] = useState("");
const onChangeHandler = (event) => {
const inputValue = event.target.value;
setValue(inputValue);
};
return (
<div>
<input type="text" onChange={onChangeHandler} value={value} />
</div>
);
};
export default App;
input 태그에서 input 필드의 값을 받아 setValue 해주는 onChange 이벤트를 등록했고, 보여지는 값(value)를 state value로 연결시켜줬다. 이러한 패턴을 제어 컴포넌트(Controlled Component)라고 한다. (리액트에 의해 값이 제어됨)
source of truth
: 어떤 정보의 정확하고 최신화된 상태를 유지하는 주된 위치/저장소
리액트의 state가 input의 value가 변경된 상태를 관리하고 있으므로 위의 예시에서 리액트가 소스 오브 트루스 역할을 한다고 할 수 있다.
데이터의 일관성/정확성을 유지하기위해 필수적인 개념이다.
비제어 컴포넌트
input의 value에 state를 연결시키지 않는 경우 이를 비제어 컴포넌트라고 하는데, 아래 관점을 주의하는 것이 좋다.
상태 업데이트 지연
- setValue와 같은 state를 업데이트 시키는 함수는 비동기함수이다.
- 만약 onChanged로 setValue를 호출하고, 변경된 value를 이용해 다른 동작을 수행할 경우 변경 전 값이 사용될 수 있다.
import React, { useState } from "react";
const App = () => {
const [inputValue, setInputValue] = useState("");
const onChangeHandler = (event) => {
setInputValue(event.target.value);
console.log(inputValue); // 변경 전 값 출력
};
return (
<div>
<input type="text" onChange={onChangeHandler} />
<p>입력값: {inputValue}</p> {/* 입력값을 화면에 표시 */}
</div>
);
};
export default App;
때에 따라 비제어 컴포넌트가 성능상의 이점이 있을 수 있지만, 입력 필드의 값을 예측 가능한 값으로 관리하기 위해 제어 컴포넌트 방식을 사용하는 것이 좋다!
불변성
: 메모리에 있는 값을 변경할 수 없는 것
불변성을 깨는 것이 문제가 되는 이유
1) 예측 불가능한 코드
- 데이터를 직접 변경할 수 있게 하는 경우, 프로그램의 다른 부분에서 해당 데이터 구조를 참고하고 있을 때 그 부분들도 예상치 못한 방식으로 변경될 수 있다.
- 이는 알 수 없는 버그, 동작 예측의 어려움으로 이어질 수 있다.
2) 버그 추적의 어려움
- 원본이 여러 곳에서 변경될 수 있다면 큰 코드베이스나 여러 개발자가 협업하는 환경에서 특히 문제가 될 수 있다.
불변성을 유지하는 방법 (Immutable way)
// 불변성을 깨트리는 경우
const arr = [1, 2, 3];
arr.push(4);
// 불변성을 유지하는 경우
const arr = [1, 2, 3];
const newArr = [...numbers, 4];
'React' 카테고리의 다른 글
[React] 리액트의 개념과 성능 최적화 팁 (0) | 2024.08.14 |
---|---|
[React] Rendering과 Virtual DOM (0) | 2024.08.08 |
[React] props와 children (0) | 2024.08.08 |
React 프로젝트 생성/구조 (0) | 2024.08.08 |
SPA (Single Page Application) (0) | 2024.08.08 |