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
'프론트엔드 > 프론트엔드 이슈' 카테고리의 다른 글
프론트엔드에서 서버로 시간을 전송할때 주의할점 (0) | 2024.06.12 |
---|---|
리액트에서 서버요청할때 베이스 URL 생략하는 방법 (0) | 2024.06.11 |
API 요청 함수 (0) | 2024.05.20 |
마우스 호버시 서브메뉴 나오기 (0) | 2024.03.20 |
환경변수를 영구적으로 설정할때 setx path 를 cmd 창에서 입력했는데 안되는 경우 (1) | 2024.01.22 |