props는 수정될 수 없는 Read-Only이다. 반면에 state는 수정될 수 있는 값으로, state가 수정되면 ReactDOM.render 메서드가 호출되어 DOM이 업데이트된다. 즉, DOM을 업데이트해야 한다면 ReactDOM.render 메서드를 다시 호출할 필요 없이 state값을 업데이트 하면 된다.
setState(updater,[callback])
componentDidUpdate(prevProps, prevState){
console.log("componentDidUpdate", prevState, this.state);
}
// 잘못된 방법
this.state.comment='hello'
// 옳은 방법
this.setState({
comment: 'hello'
});
this.setState((prevState, props)=>({
counter: provState.counter+props.increment
)});
setState를 호출하게 되면 첫 번째 setState와 두 번째 setState가 한 사이클 안에서 호출되기 때문에 두 setState는 일괄 처리하게 된다. 다음 state가 이전 state에 따라 업데이트하고 싶다면 updater함수를 사용하면 된다.
class TestComponent extends React.Component{
constructor(props){
super(props);
this.state={quantity:1};
}
componentDidMount(){
this.setState((prevState, props) =>{
return {quantity: prevState.quantity +1};
});
this.setState((prevState, props) =>{
return {quantity: prevState.quantity +1};
});
}
render(){
return(
<div>quantity: {this.state.quantity}</div>
);
}
}
ReactDOM.render(
<TestComponent number="2" />,
document.getElementById('root')
);
state update 경우 1.X 바로 2. 호출
componentWillUpdate 메서드 안에서 this.setState를 호출하게 되면 무한루프에 빠진다. props의 변화에 따라 state를 변경해야 할 경우 componentWillReceiveProps 메서드를 사용해야 한다.
// DOM
// .addEventListener 사용
// 이벤트 동작 막기 return false;
<button onclick= "eventHandler()"> // 문자열
// React
// 이벤트 핸들러 정의
// 이벤트 동작 막기 e.proventDefault();
<button onClick={eventHandler}></button> // 함수