
주요 특징
1. 비동기 데이터 처리 지원 : 비동기 작업이 완료될 때까지 UI의 일부분을 대체 콘텐츠로 대체
2. Fallback UI 제공 : 비동기 작업이 진행 중일 때 표시할 대체UI(fallback) 설정 가능
3. React.lazy와 함께 사용 : 코드 스플리팅을 위해 React.lazy와 함께 컴포넌트를 동적으로 로드하는 경우 유용
동작 방식
1. Suspense 내부의 컴포넌트가 비동기 작업을 수행하는 동안 fallback으로 지정된 콘텐츠 표시
2. 작업이 완료되면 원래의 컴포넌트를 화면에 렌더링
3. 여러 Suspense 컴포넌트를 중첩하여 다양한 비동기 작업에 따른 다양한 UI상태 관리
주의 사항
**fallback
import React, { Suspense } from "react";
const LazyComponent = React.lazy(() => import("./LazyComponent"));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
);
}
export default App;
**React.lazy
리액트는 상태가 바뀌면 화면을 다시 그려야 한다고 약속 -> 상태가 바뀌었는지 쉽게 확인하려면 상태가 불변이어야 함
React의 작동 방식 및 성능 최적화와 밀접한 관련
리덕스, 몹엑스, 주스탠드 등과 같은 상태 관리 라이브러리는 상태 변경 로직에서 불변성을 유지하는 것을 기본 전제로 설계
** 상태 관리 라이브러리에서 불변성이 중요한 이유
- 상태 변경 감지 메커니즘 : 상태가 변경되었는지 감지하기 위해 "참조값 비교"를 사용, 상태가 불변성을 유지하면 변경된 상태와 기존 상태를 참조값만 비교하면 되므로 성능 향상
| 특성 | 제어 컴포넌트 | 비제어 컴포넌트 |
|---|---|---|
| 데이터 관리 위치 | React 상태(state) | DOM |
| 값 접근 방식 | 상태를 통해 직접 접근 | ref를 통해 간접적으로 접근 |
| 폼 데이터 검증 | 상태 기반으로 실시간 검증 가능 | 제출 시 데이터 접근 후 검증 가능 |
| 초기값 설정 | React 상태를 통해 설정 | defaultValue 속성을 통해 설정 |
| 복잡성 | 복잡한 폼에서는 코드가 길어질 수 있음 | 간단한 폼에서는 코드가 더 간단함 |
[제어 컴포넌트]
import React, { useState } from "react";
function ControlledComponent() {
const [value, setValue] = useState("");
const handleChange = (event) => {
setValue(event.target.value); // React 상태 업데이트
};
const handleSubmit = (event) => {
event.preventDefault();
alert(`Submitted value: ${value}`);
};
return (
<form onSubmit={handleSubmit}>
<input type="text" value={value} onChange={handleChange} />
<button type="submit">Submit</button>
</form>
);
}
export default ControlledComponent;
장점
[비제어 컴포넌트]
import React, { useRef } from "react";
function UncontrolledComponent() {
const inputRef = useRef(null);
const handleSubmit = (event) => {
event.preventDefault();
alert(`Submitted value: ${inputRef.current.value}`); // DOM에서 값 읽기
};
return (
<form onSubmit={handleSubmit}>
<input type="text" ref={inputRef} />
<button type="submit">Submit</button>
</form>
);
}
export default UncontrolledComponent;
장점
단점
** 언제 어떤 것을 사용해야 할까?
1. 제어 컴포넌트가 적합한 경우