본문 바로가기
JavaScript

useEffect hook

by 호랑말코호랑 2022. 5. 28.

mount, update, unmount 할 때 사용하는 react hook

그래서 얘는 왜쓴다고?

원래대로라면 빙글빙글돌아가는 멧돌~~~~~~커다란돌멩이는 짱돌~~~~~~~~ 

수도 없이 다시 리로드 되는데 이렇게되면 리로드 되지 않길 바라는 함수도 리로드 될 수 있기 때문에 그걸 막아주기 위해서 유즈이펙트로  막아준다.

채팅 서버에 연결한다던가 등 컴포넌트가 마운트되면서 처음 1회만 수행되어야 하는 동작이 필요할 때 useEffect를 사용할 수 있으며 컴포넌트가 마운트될 때 뿐만 아니라 원하는 값이 변경될 때도 이펙트를 호출할 수도 있다.

useEffect를 통해서 특정 코드들이 component가 처음 생성될때만 실행되게 바꿀 수 있는 것을 볼 수 있다.

 

 

useEffect  콜백함수 사용

useEffect(()=> {
//작업
})

랜더링 될때마다 실행

useEffect (() => {
//작업...
},[value]);

맨처음과 value값이 바뀔떄 실행

useEffect (() => {
//작업...
},[]);

맨처음에만 실행

이 세가지 함수 사용

 

useEffect로 함수를 진행했다면 그걸 멈춰주는 clean up 즉 정리가 필요한데 그 함수 안에서 리턴하면 해당컴포넌트가 언마운트 될 때 혹은 다음 랜더링시 불릴 useEffect가 실행이 되기 이전에 실행된다.

useEffect (() => {
//구독..
 return() => {
  //구독해지 함수
 }
},[value]);
import './App.css';
import {useState,useEffect} from 'react';

function App() {
  const [count,setCount]  = useState(1);
  const [name, setName] = useState('')

  const handleCount = () => {
    setCount(count +1)
  }
  const handleInput = (e) =>{
    setName(e.target.value)
  }
  // 마운팅 + 랜더링 될 때마다 매번 실행됨
  // 특정 상황에서만 랜더링 되게 하려면 뒤에 [dependency array]넣어줘서 여기의 경우 count의 값이 변화 되었을 때만 랜더링이 일어남
  //만약 마운팅 될때만 유즈이펙트가 실행되게 하려면 디펜던시어레이 지우면됨
useEffect(()=>{
  console.log('카운트 변화');
},[count])

  return (
    <div>
      <button onClick={handleCount}>Update</button>
      <span>count : {count}</span>
      
      <input type="text" value={name} onChange={handleInput}/>
      <span>name : {name}</span>
    </div>
  )
}

export default App;

 

클리어하기 :타이머 종료하기

  App.js

import './App.css';
import {useState,useEffect} from 'react';
import Timer from './Timer';

function App() {
  const [showTimer , setShowTimer] = useState(false)
//showTimer가 트루일때만 타이머를 보여주고싶어. 
//온클릭 누르면 showTimer가 true false 번갈아가면서 바뀜
//showTimer가 true일때만타이머를 보여준다...showTimer &&<Timer/>,,&& 두 연산자가 모두 참일때 true를 
// 반환 여기서는 <Timer>은항상 트루일테니 쇼타이머가 트루면 <Timer>가 나온다
  return (
    <div>
      {showTimer &&<Timer/>}   
      <button onClick={() => setShowTimer(!showTimer)}>Toggle Timer</button>
    </div>
  )
}

export default App;

Timer.js

import './App.css';
import {useState,useEffect} from 'react';

function Timer(props) {
  
useEffect(()=>{
  const timer = setInterval(()=>{
    console.log('타이머 돌아가느중...');
},1000);

return () =>{
  clearInterval(timer)
  console.log('타이머가 종료되었습니다!')
  //리턴은 타이머컴포넌트가 언마운트 될 때 실행됨 이렇게 해야 멈추어
}
},[])
//뒤에 빈 배열 넣어줌으로서 마운팅 될때만 실행하게 해줌
    
  return (
    <div>
      <span>타이머를 시작합니다. 콘솔을 보세요!</span>
    </div>
  )
}

export default Timer;

 

 

'JavaScript' 카테고리의 다른 글

Reducer 코드 뜯어보기  (0) 2022.06.06
State  (0) 2022.05.23
코딩앙마 JS DOM & EVENT 정리  (0) 2022.05.21
코딩 앙마 왕초보  (0) 2022.05.21
노마드 코더 바닐라 JS-2  (0) 2022.05.20

댓글