일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 로드마크
- hoisting
- 함수형
- 유사배열
- 호출 스택
- pushstate
- fetch 취소
- debounce
- 웹팩
- 실행 컨택스트
- 넘블
- 클론코딩
- JavaScript
- 화살표 함수
- 이벤트 루프
- Call stack
- AbortController
- 번들러
- 비동기 작업
- Lexical environment
- 매클로태스크
- 호이스팅
- webpack
- relatedTarget
- 이터러블
- 마이크로태스크
- localtunnel
- 렉시컬 환경
- 로컬터널
- 자바스크립트
- Today
- Total
내가 보려고 만든 개발 공부 일지
useState 기본 개념 본문
1. useState의 반환값
useState 는 길이 2짜리 배열을 리턴하는데 각각 상태변수, 상태변수 settet함수 이다.
그래서 보통 사용할땐 배열의 비구조할당을 이용해 변수에 할당한다.
var [num, setNum] = useState(1);
위 코드에서 num 은 1 로 초기화되고 setNum함수로 num 값을 갱신해줄 수 있다.
값 갱신 : setNum(num + 1) --> num 값이 달라졌으므로 리렌더링이 발생한다.
2. 상태변수가 객체, 배열같은 참조값일때
만약 const [obj, setObj] = useState({ name : "kks", birth : "93" }); 처럼 상태변수의 초기값이 객체인 경우,(참조값을 가지는 변수 = 배열, 객체)
obj.name = "kks" 와 같이 직접 수정하면 리렌더링이 일어나지않는다.
그래서 새로운 객체를 만들고 변화를 준 다음(새로운 주소값) setter함수로 상태값을 수정해주어야 한다. 그래야 리렌더링이 발생한다.
--> var newObj = { name : "ham", birth : "93" } --> setObj( newObj )
3. 리렌더링 시점
useState의 setter함수 가 호출되면 바로 렌더링이 일어나냐. 그건 아니다.
코드 흐름상 setter함수가 여러 번 쓰일 수 있지만 setter함수는 비동기적으로 수행된다.
즉, 상태 업데이트는 일단 나중으로 미뤄두고, 현재 js 호출 스택이 모두 비워지면 그때
실제로 상태 업데이트를 진행한다.
이 과정에서 기존상태와 새로운 상태가 같다고 판단되면 렌더링을 하지않는다. 비교는 Object.is 로 한다. (=== 연산자와 비슷)
참고 : https://velog.io/@gwak2837/React-Hooks%EC%9D%98-%EC%9D%B4%ED%95%B4
'React' 카테고리의 다른 글
React - useReducer (0) | 2021.07.16 |
---|---|
Hooks 사용 규칙 (0) | 2021.07.02 |
props.children (0) | 2021.07.02 |
React 컴포넌트 함수형 vs Class형 (0) | 2021.07.02 |