오늘 알아볼 것
Prop와 유사하지만 비공개이며, 컴포넌트에 의해 완전히 제어된다.
function Clock(props) {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {props.date.toLocaleTimeString()}.</h2>
</div>
);
}
클래스로 변환시키면,
class Clock extends React.Component {
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.props.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
여기서 render 메서드는 업데이트가 발생할 때마다 호출되지만, 같은 DOM 노드로 Clock 컴포넌트를 렌더링하는 경우 Clock 클래스의 단일 인스턴스만 사용된다.
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>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
마운팅
컴포넌트가 처음 DOM에 렌더링 될 때마다 타이머를 설정한다.
언마운팅
컴포넌트에 의해 생성된 DOM이 삭제될 때마다 타이머를 해제한다.
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
}
componentWillUnmount() {
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
componentDidMount()는 컴포넌트 출력물이 DOM에 렌더링 된 후 실행된다.
여기서 타이머를 설정하기 좋다.
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount()에서는 타이머를 분해한다.
componentWillUnmount() {
clearInterval(this.timerID);
}
setState를 사용하여 date를 업데이트 하는 메서드를 구현한다.
tick() {
this.setState({
date: new Date()
});
}
생명주기에 대한 자세한 글은 여기로
State를 직접 수정하지 말 것.
대신 setState를 사용하자.
State 업데이트는 비동적일 수 있다.
React는 성능을 위해 setState 호출을 한꺼번에 처리할 수 있다.
this.state가 비동기적으로 업데이트 될 수 있기 때문에 다음 state를 계산할 때
해당 값에 의존해서는 안된다.
State 업데이트는 병합된다.
setState를 호출할 때 React는 제공한 객체를 현재 state로 병합합니다.
컴포넌트는 자신의 state를 자식 컴포넌트에 props로 전달 할 수 있다.
일반적으로 이를 하향식, 단방향식 데이터 흐름이라고 한다.
모든 state는 항상 특정한 컴포넌트가 소유하고 있다.
그 state로 부터 파생된 UI또는 데이터는 오직 트리구조에서 자신의 아래에 있는 컴포넌트에만 영향을 미친다.