-
의도와 다른 동작
incrementCount() { // 주의: 이 코드는 예상대로 동작하지 *않을 것*입니다. this.setState({count: this.state.count + 1}); } handleSomething() { // `this.state.count`가 0에서 시작한다고 해봅시다. this.incrementCount(); this.incrementCount(); this.incrementCount(); // React가 컴포넌트를 리렌더링할 때 `this.state.count`는 3이 될 것 같은 예상과 달리 1이 됩니다. // 이것은 `incrementCount()` 함수가 `this.state.count`에서 값을 읽어 오는데 // React는 컴포넌트가 리렌더링될 때까지 `this.state.count`를 갱신하지 않기 때문입니다. // 그러므로 `incrementCount()`는 매번 `this.state.count`의 값을 0으로 읽은 뒤에 이 값을 1로 설정합니다. }
개선
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이 됩니다. }
setState()는 컴포넌트 state의 변경 사항을 대기열에 집어넣고, React에게 해당 컴포넌트와 그 자식들이 갱신된 state를 사용하여 다시 렌더링되어야 한다고 알린다. 이 메서드는 이벤트 핸들러와 서버 응답 등에 따라 UI를 갱신할 때에 가장 많이 사용하는 메서드다.
setState()는 컴포넌트를 갱신하는 데에 있어 즉각적인 명령이 아니라 요청이라고 생각해야 한다. 인지 성능(Perceived Performance)의 향상을 위하여 React는 이 메서드의 실행을 지연시키고 여러 컴포넌트를 한번에 갱신할 수도 있다. In the rare case that you need to force the DOM update to be applied synchronously, you may wrap it in flushSync, but this may hurt performance.
setState()는 컴포넌트를 항상 즉각적으로 갱신하지는 않는다. 여러 변경 사항과 함께 일괄적으로 갱신하거나, 나중으로 미룰 수도 있다. 그러므로 setState()를 호출하자마자 this.state에 접근하는 것은 잠재적인 문제가 될 수 있다. 그 대신에 componentDidUpdate 또는 setState의 콜백(setState(updater, callback))을 사용한다. 둘 다 갱신이 적용된 뒤에 실행되는 것이 보장된다.
shouldComponentUpdate()가 false를 반환하지 않는다면 setState()는 항상 렌더링이 다시 발생하도록 만듭니다. 가변 객체의 사용으로 인하여 shouldComponentUpdate() 내에서 조건부 렌더링을 구현할 수 없다면, 새로운 state가 이전의 state와 다를 때에만 setState()를 호출할 것. 그래야 불필요하게 다시 렌더링이 발생하지 않는다.'React' 카테고리의 다른 글
React HelloWorld Tsx파일 Ex (0) 2022.12.20 React 에서 서버와 연동 (0) 2022.11.25 NodeJs & Typescript 기반에서 React 배포 (0) 2022.11.20 React 빌드와 테스트 (0) 2022.11.20 React props 합성 (Composition) Ex (0) 2022.11.19 React props.children Ex (0) 2022.11.19 React Element 변수 Ex (0) 2022.11.19 React Event (0) 2022.11.19