프론트엔드/프론트엔드 이슈
컴포넌트 리렌더링과 state 상태 (.feat 클린업)
syleemomo
2024. 5. 29. 16:47
728x90
컴포넌트가 리렌더링된다고 해서 state 값이 초기화되는 것이 아니다. 아래와 같은 상황을 생각해보자!
import React, { useState, useEffect } from 'react'
import './App.css'
function App(){
const [weather, setWeather] = useState(null)
const [reset, setReset] = useState(true)
const handleClick = () => setReset(false)
useEffect(() => {
console.log("날씨")
if(reset){
setWeather("맑음")
}
// return () => setWeather(null)
}, [reset])
console.log("렌더링", weather)
console.log("===============")
return (
<div className='App'>
<button onClick={handleClick}>초기화</button>
<h1>{weather}</h1>
</div>
)
}
export default App
App.js 파일을 위와 같이 작성한다.
초기 렌더링시 무조건 useEffect 함수의 인자로 주어진 콜백함수가 실행되므로 weather 상태는 "맑음"으로 설정된다.
"초기화" 버튼을 클릭하면 reset 상태가 false 로 변경되면서 컴포넌트가 리렌더링된다. 하지만 weather 는 기존상태인 "맑음" 그대로 유지된다. 절대 초기화되지 않는다. 또한, reset 이 변경되었으므로 useEffect 함수의 인자로 주어진 콜백함수가 재실행되면서 콘솔에 "날씨"가 출력이 된다.
그럼 현재 상황에서 컴포넌트가 리렌더링될때 weather 상태를 초기화하려면 어떻게 하면 될까?
useEffect(() => {
console.log("날씨")
if(reset){
setWeather("맑음")
}
return () => setWeather(null) // 클린업(clean-up)
}, [reset])
useEffect 함수의 콜백함수가 실행될때 클린업(clean-up) 함수를 등록하여 weather 상태를 초기화해주면 된다.
728x90