직접 State를 수정하지 않기
setState를 쓰지 않고 직접 State를 수정한다면?
React가 state가 변경된 걸 인지하지 않는다. 그러면 render()를 호출하지 않을거고, 아무런 변화가 없음.ㅜㅜ
직접 state를 지정할 수 있는 건 constructor에서 this.state로 초기 값을 줄 때 뿐...
State 업데이트는 비동기적일 수 있다
React는 성능을 위해 여러 setState() 호출을 단일 업데이트로 한꺼번에 처리하기도 한다.
this.props와 this.state가 비동기적으로 업데이트 될 수 있기 때문에 state 계산 시 값에 주의해야 한다.
//실패 예 this.setState({ counter: this.state.counter + this.props.increment, });
해당 경우 state가 실시간 업데이트 안 됐는데 계산이 될 수 있다.
이를 잘 사용하기 위해 함수를 인자로 쓰는 setState()를 만든다. 이렇게 하면 이전 state를 첫 번째 인자로 받고, 업데이트 된 시점에 props를 두 번째 인자로 받아들인다.
//이렇게 씁니다 this.setState((state, props) =>({ counter: state.counter + props.increment }));
또 다른 예시를 살펴보자.
incrementCount() { this.setState((state) => { // 중요: 값을 업데이트할 때 `this.state` 대신 `state` 값을 읽어옵니다. return {count: state.count + 1} }); } handleSomething() { // `this.state.count`가 0에서 시작한다고 해봅시다. this.incrementCount(); this.incrementCount(); this.incrementCount(); // 지금 `this.state.count` 값을 읽어 보면 이 값은 여전히 0일 것입니다. // 하지만 React가 컴포넌트를 리렌더링하게 되면 이 값은 3이 됩니다. }
this.state.count가 0으로 초기 값을 설정했다고 했을 때
this.incrementCount();를 세 번 해서 +1 +1 +1이 되었다.
하지만 위 코드처럼 this.state.count
값을 읽어와도 여전히 값이 0일 것이다. 랜더링 한번에 처리하기 때문에(비동기적으로 작동하기 때문에) 의도한대로 계산이 안될 수 있다.
React가 컴포넌트를 리렌더링하게 되면 그 때야 값이 3이 된다...
State 업데이트는 병합된다
setState()를 호출할 때 React는 제공한 객체를 현재 state로 합칩니다.
예를 들어 state가 다음처럼 여러 변수(posts, comments)를 갖고 있다고 했을 때
constructor(props){ super(props); this.state ={ posts: [], comments: [] } }
개별적으로 값을 업데이트 할 수 있습니다
componentDidMount(){ fetchPosts().then(response =>{ this.setState({ posts: response.posts //this.state.comments에는 영향 없음 }); }); fetchComments().then(response => { this.setState({ comments: response.comments )}; }); }
참고
'JavaScript > React' 카테고리의 다른 글
create-react-app (0) | 2021.03.08 |
---|---|
리액트 시작하기-기본적으로 필요한 툴 (0) | 2021.03.08 |
11. 합성 vs 상속 (0) | 2021.02.05 |
6. 이벤트 처리 (0) | 2021.02.02 |
5. State와 생명주기 (0) | 2021.02.01 |
Uploaded by Notion2Tistory v1.1.0