useState
import {useState} from 'react'
const [state,setState] = useState(initialState)
인수로는 사용할 state의 초깃값을 넘겨줌 (안넣으면 undefined
)
반환값은 배열
첫 번째 원소로 state 값 자체, 두 번째 원소 setState 함수를 사용해 state 값을 변경할 수 있음
function Component(){
let state='hello'
function handleButtonClick(){
state='hi'
}
return(
<>
<h1>{state}</h1>
<button onClick={handleButtonClick}>hi</button>
</>
)
}
이는 동작하지 않습니다.
이유는, 리렌더링이 일어나지 않기 때문입니다.
렌더링 함수 컴포넌트의 return과 클래스 컴포넌ㄴ트의 render 함수를 실행 -> 이 실행 결과를 이전의 리액트 트리와 비교해 리렌더링이 필요한 부분만 업데이트해 이뤄짐
function Component(){
let state='hello'
const [,triggerRender] = useState()
function handleButtonClick(){
state='hi'
triggerRender()
}
return(
<>
<h1>{state}</h1>
<button onClick={handleButtonClick}>hi</button>
</>
)
}
위와 같이 변경해도 문제가 해결이 되지 않는다!
이유는, 렌더링은 함수 컴포넌트에서 반환한 결과물은 return의 값을 비교해 실행되기 때문입니다. 즉 매번 렌더링이 발생될 때마다 함수는 다시 새롭게 실행됩니다. 이 말은 결국 state도 다시 hello로 초기화가 되게 됩니다.
함수 컴포넌트는 매번 함수를 실행해 렌더링이 일어나고, 함수 내부의 값은 함수가 실행될 때마다 다시 초기화 됩니다.
useState의 예상 내부 구조
function useState(initialValue){
let initialState=initialValue
function setState(newValue){
initialState=newValue
}
return [initialState,setState]
return(
<>
<h1>{state}</h1>
<button onClick={handleButtonClick}>hi</button>
</>
)
}
하지만 이것을 실제로 실행시켜보면 원하는 대로 작동하지 않습니다.