# Lifecycle과 useEffect

예제)

// 예전 형식 (class 사용하는 형식)
class Detail2 extends React.Compoenent {
  componentDidMount() {
      //마운트시 실행
  }
  compoenetDidUpdate {
      //업데이트시 실행
  }
  compoenetWillUnmount(){
    // 언마운트시 실행
  }
}
// 최신 형식
function Detail(props) {
    //mount, update시 코드를 싱행해주는 useEffect
	useEffect(()=>{
    	console.log('안녕')
  	})
    
    ... 본문
}

예제

  1. 아래 박스를 페이지 로딩 이후 2초 뒤에 사라지게 만들어보자
<div className="alert alert-warning">
  2초이내 구매시 할인
</div>
useEffect(()=> {
setTimeout(()=>{ document.getElementById("Event").style.display = 'none' }, 2000)
})

...본문...
<div id="Event" className="alert alert-warning">
  2초이내 구매시 할인
</div>
useEffect(()=> {
    setTimeout(()=> { setAlert(false) }, 2000)
})
let [alert,setAlert] = useState(True)
...본문...
{
    alert ? <div className="alert alert-warning">
  2초이내 구매시 할인
</div> : null
}

심화

useEffect()의 맨마지막에 [실행조건]을 넣으면 정확한 시점을 지정할 수 있다.

 useEffect(()=> {
    setTimeout(()=> { setAlert(false) }, 2000)
  }, [count]) // count변수가 변경될때마다 실행

응용

  1. 다음과 같이 작성하면 마운트 시에만 실행되도록 설정할 수 있다.
 useEffect(()=> {
    setTimeout(()=> { setAlert(false) }, 2000)
  }, []) // array를 빈칸으로하면 된다.
  1. useEffect에 return값을 지정가능하다 (Clean up function)
    • 이러면 useEffect동작 전에 실행된다.
 useEffect(()=> {
    let a = setTimeout(()=> { setAlert(false) }, 2000)
    
 	return ()= {
        //코드를 작성하면 이 코드는 UseEffect 동작 전에 실행된다.
        //ex) 기존 타이머는 제거해주세요
        //타이머를 변수에 담아두고 삭제하면된다.
        clearTimeout(a)
    }
  }, [])
 useEffect(()=> {
    // 데이터 불러오는 함수
    
 	return ()= {
        // 기존 데이터 요청을 제거하는함수
    }
  }, []) //[]을 통해 mount시에만 실행되게끔

요약

1. useEffect(()=>{코드작성}) | 재랜더링 마다 실행하고싶을때

2. useEffect(()=>{코드작성}, []) | mount시에 1회 실행하고 싶으면

3. useEffect(()=>{코드작성

   return () => {

   //cleanup function 작성 

   }

   }, [])  | unmount시 1회 실행하고 싶을때 실행하고싶을때

예제

useEffect를 이용해서 숫자 이외의 값이 들어오면 Alert를 표시하는 인풋을 만들어보자

let [value, setValue] = useState('')
  let [textAlert, setTextAlert] = useState(false)

  useEffect(() => {
    isNaN(value)? setTextAlert(true) : setTextAlert(false);
  }, [value])

return(
{
textAlert ? <p className="col text-danger">숫자만 입력해주세요</p> : null
}
</div>
<input type="text" className="col form-control red" placeholder="숫자 입력" onChange={ (e) => setValue(e.target.value)} />
</div>
)