state
`state`는 `JSX`에서 제공하는 컴포넌트 내에서 상태를 관리하기 위해 사용되는 기능입니다. `Hook` 기능이 개발이 되기 전까지는 클래스 컴포넌트 내에서 모든 `state` 생명주기를 관리 해왔습니다. 그렇기 때문에 오래된 문서를 보게 되면 제어 컴포넌트를 생성하게 되면 클래스 컴포넌트를 활용해 개발하는 것을 볼 수 있습니다.
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
이러한 클래스 컴포넌트를 사용하는 주 된 이유는 `state`의 생명주기를 모두 하나의 클래스에서 관리할 수 있기 때문입니다. 그렇다고 해서 함수형 컴포넌트에서는 불가능하냐 라는 것인데, `JavaScirpt`는 함수형과 클래스는 같은 `prototype`의 구조를 가지므로 함수형으로도 개발이 가능합니다. 하지만 이렇게 클래스 컴포넌트로 생성하는 개인적 이유로는 개발자의 편의성 때문이지 않을까 생각합니다.
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date()
});
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Clock />);
`state`를 사용하면서 주의해야 하는 것은 `setState`를 어떤 상황에서 사용해야 하는 것인가 입니다. 다음과 같이 아래와 같은 코드가 있다고 보겠습니다
this.state.comment = 'Hello';
해당 코드는 변경이 되어도 `React DOM` 에서 변경을 감지하지 못하여 변경을 하지 못합니다. 그렇기 때문에 자동으로 변경을 감지하게 하려면 `setState` 함수를 사용하여야 합니다 .
this.setState({comment: 'Hello'});
`setState` 함수는 비동기적으로 작동을 합니다. 그러므로 다른 동기적 함수에 의존하지 않도록 코드를 작성하여야 합니다. 동기적 함수와 의존을 하게 되어야 하는 환경이라면 콜백 함수로 작성하여 `setState`함수를 수행토록 하여야 합니다.
this.setState((state, props) => ({
counter: state.counter + props.increment
}));
state vs props
먼저, `state`는 유상태와 무상태로 나뉘게 됩니다. 여기서 유 유상태 컴포넌트는 자신의 상태를 변경할 수 있는 함수를 자식 컴포넌트에게 `props`로 전달할 수 있습니다. 이를 통해 자식 컴포넌트도 상태 변화를 일으킬 수 있습니다. 무상태 컴포넌트는 상태를 가지지 않으므로, 주로 부모 컴포넌트로부터 받은 `props` 를 이용하여 렌더링만 수행하며, 자체적으로 데이터를 변경하지는 않습니다.
여기서 우리가 알아야 하는 것은 `props`와 `state`의 차이점 입니다. `React` 문서에서 특히나, 이 두가지의 차이점에 대해서 주의 깊게 알려주고 있습니다.
state
- 내부 상태 관리: `state`는 컴포넌트 내부에서 관리되며, 컴포넌트의 상태를 나타내는 데이터를 포함합니다. 이 상태는 주로 사용자와의 상호작용이나 서버 응답 등으로 인해 동적으로 변경될 수 있습니다.
- 컴포넌트 특유의 정보: 각 컴포넌트는 자신만의 `state`를 가질 수 있으며, 이를 직접 관리하고 업데이트 합니다.
- 동적인 데이터: 사용자의 입력, 버튼 클릭, 데이터 수신 등에 의해 변경될 수 있는 동적 데이터를 다룹니다.
- 변경 가능: 컴포넌트는 자신이 `state`를 변경할 수 있고, 이는 일반적으로 `setState` 메서드를 통해 수행됩니다.
props
- 데이터 전달: `props`는 부모 컴포넌트로부터 자식 컴포넌트로 데이터를 전달하는 데 사용됩니다. 이는 컴포넌트가 외부에서 받은 데이터를 처리하거나 표시할 때 중요합니다.
- 읽기 전용: `props`는 읽기 전용이며, 컴포넌트는 자신에게 전달된 `props`를 변경할 수 없습니다. `props`를 변경하려면 부모 컴포넌트에서 변경해야 합니다.
- 재사용성 증가: `props`를 통해 동일한 컴포넌트에 다른 데이터를 전달함으로써 컴포넌트의 재사용성을 높일 수 있습니다.
- 함수 포함 가능: `props`는 데이터뿐만 아니라 함수도 포함할 수 있으며, 이를 통해 부모 컴포넌트로부터 자식 컴포넌트로 특정 작업을 수행하는 함수를 전달할 수 있습니다.
state와 props의 차이점
- 변경 가능성: `state`는 컴포넌트 내부에서 변경할 수 있지만, `props`는 변경할 수 없습니다.
- 용도: `state`는 컴포넌트 내부에서 데이터를 관리하기 위해 사용되며, `props`는 컴포넌트 간에 데이터를 전달하기 위해 사용됩니다.
- 제어: `state`는 컴포넌트 자신이 제어할 수 있는 반면, `props`는 부모 컴포넌트로부터 제공받아 자식 컴포넌트가 사용합니다.
state 끌어올리기
`state`를 사용하다보면 하나의 자식 컴포넌트에서 사용되는 상태를 여러 컴포넌트에서 사용하여야 하는 경우가 생기게 됩니다. 이럴 때, `state` 끌어올리기를 수행하여 상위 컴포넌트에서 상태를 관리를 할 수 있도록 하고, 기존 자식 컴포넌트들은 유상태 컴포넌트가 될 수 있도록 하여야 합니다.
'Frontend > React' 카테고리의 다른 글
[React] Hydration과 Dehydration (0) | 2024.06.22 |
---|---|
React) Hook, useState, useEffect (0) | 2024.05.06 |
React) Element, Component 와 Props (0) | 2024.05.05 |
React) JSX (0) | 2024.05.05 |