일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 10172
- setstate
- DataFrame
- barplot in r
- barplot
- 백준 11718
- await
- 이스케이프시퀀스
- vetor
- 이용현황분석
- 백준 10172
- useState
- R 그래프
- 값삭제
- 배열추가
- 광명시버스분석
- getline
- 그대로 출력하기
- 데이터분석
- 백준
- 값추가
- 탈출문자
- asynchronization
- R데이터형태
- 버스분석
- React
- 배열삭제
- 그래픽
- plot in r
- react #회원가입 #비밀번호비교
- Today
- Total
devlog_zz
setState 호출 직후 상태가 바로 업데이트 되지 않는 이슈 본문
[ setState() 호출 후 상태가 바로 업데이트 되지 않는 이슈 ]
1. setState() 후 값을 바로 API body 에 넣어서 보낼 때
2. 연속적으로 setState를 호출할 때
react로 개발하면서 이와 같은 이슈를 경험한 적이 있다.
setState()는 비동기
setState() 호출은 비동기적으로 이뤄지기 때문에 setState호출 직후 새로운 값이 반영되지 않는다.
리액트 엘리먼트 트리와 전달받은 state가 적용된 엘리먼트 트리를 비교하는 작업을 거치고 최종적으로 변경된 부분만 DOM에 적용된다.
React는 컴포넌트가 리렌더링될 때까지 값을 갱신하지 않기 때문이다.
setState는 이벤트 핸들러 내에서 비동기적이기 때문에 react는 브라우저 이벤트가 끝날 시점에 state를 일괄적으로 업데이트한다. 불필요한 렌더링을 방지하며 성능을 향상시킨다.
incrementCount() {
// 주의: 이 코드는 예상대로 동작하지 *않을 것*입니다.
this.setState({count: this.state.count + 1});
}
handleSomething() {
this.incrementCount();
this.incrementCount();
this.incrementCount();
}
// 3을 예상하고 코드를 짰지만 결과 값 1
마지막 값만 set됨
이런 패턴을 오브젝트 컴포지션(object composition)이라고한다.
자바스크립트에서 만약 3개의 객체가 동일한 키를 갖고 있다면, Object.assign()에 마지막으로 전달 된 객체의 키 값이 우선된다.
setState는 이벤트 핸들러 내에서 비동기적으로 동작한다. 즉, 하나의 이벤트 핸들러 내에서 setState가 여러번 호출된다면, 이벤트가 끝날 시점에 state를 일괄적으로 업데이트하고 렌더링한다. ( 성능 향상을 위해 )
해결방법 1
setState에 객체를 전달하지 않고 함수를 전달
setState가 비동기적으로 동작한다는 것은 변함 없지만 인자로 넘겨 받는 함수들은 queue에 저장되어 순서대로 실행된다.
첫번째 함수가 실행된 후 리턴하는 업데이트된 state가 두번째 함수의 인자로 들어가는 방식
incrementCount() {
this.setState((state) => {
// 중요: 값을 업데이트할 때 `this.state` 대신 `state` 값을 읽어옵니다.
return {count: state.count + 1}
});
}
handleSomething() {
this.incrementCount();
this.incrementCount();
this.incrementCount();
}
https://ko.reactjs.org/docs/faq-state.html#why-is-setstate-giving-me-the-wrong-value
컴포넌트 State – React
A JavaScript library for building user interfaces
ko.reactjs.org
submit(){
this.setState(function(prevState, props){
return {showForm: !prevState.showForm}
});}
add() {
this.setState({count: this.state.count+1}, () => {
console.log(this.state.count);
});
}
handleClick() {
this.add();
}
해결방법 2
새로운 state 객체를 받기
setState() 후 값을 바로 API body 에 넣어서 보낼 때
새로운 객체를 만들어 보내기
상세한 예시로 설명한 아래 글을 참고하세요.
https://yjae-sw.tistory.com/224
[React] setState() 후 state값을 바로 API 파라미터로 호출할 때 주의점, setState후 console.log()에 새로운
setState() 후 state값을 바로 API 파라미터로 호출할 때 주의점 사용자가 화면에서 값을 클릭하면 API 를 호출하여 선택한 값의 내용을 가져오는 기능을 구현해봅시다. 아래와 같은 순서로 구현할 것
yjae-sw.tistory.com
'Front End > React' 카테고리의 다른 글
부모 Component에서 자식 Component로 setState 전달하기 (0) | 2022.05.10 |
---|---|
react hooks useState array push, pop, 배열 값 추가, 값 삭제 (0) | 2022.05.10 |
회원가입 - 비밀번호 일치 여부 확인 (0) | 2022.01.31 |
too many re-renders. react limits the number of renders to prevent an infinite loop 에러 해결 (0) | 2021.01.05 |
React TIL - 값 수정 할 때 주의점 (0) | 2020.12.18 |