개발/React

React 기본 - UseEffect

멍멍이코더 2023. 3. 9. 11:58

UseEffect

import { useEffect, useState } from "react";

function App() {
  const [counter, setValue] = useState(0);
  const [keyword, setKeyword] = useState("");
  const onClick = () => setValue((prev) => prev + 1);
  const onChange = (event) => setKeyword(event.target.value)

  console.log("i run all the time...");

  return (
    <div>
      <h1>{counter}</h1>
      <button onClick={onClick}>click me</button>
    </div>
  );
}

export default App;

버튼을 Click할 때마다 컴포너트가 Re-Rendering되어 console.log가 계속 찍히게 된다.

하지만 어떤 경우에는 한번만 실행시켜야 할때가 필요한데, 이럴때 UseEffect를 사용하면 된다!

 

import { useEffect, useState } from "react";

function App() {
  const [counter, setValue] = useState(0);
  const onClick = () => setValue((prev) => prev + 1);
  
  console.log("i run all the time...");

  useEffect(() => {
    console.log("I run only once.")
  }, []);
  
  return (
    <div>
      <h1>{counter}</h1>
      <button onClick={onClick}>click me</button>
    </div>
  );
}

export default App;

useEffect 안에 있는 코드는 한번만 실행된다.

 

state 값의 변화를 감지하여 실행시킬 수도 있다.

useEffect의 2번째 인자에 state 변수를 넣어주면 해당 변수의 변경을 감지하여 함수를 실행시킨다.

import { useEffect, useState } from "react";

function App() {
  const [counter, setValue] = useState(0);
  const onClick = () => setValue((prev) => prev + 1);

  console.log("i run all the time...");

  // 한번만 실행 
  useEffect(() => {
    console.log("I run only once.")
  }, []);
  
  // count 값이 변경될 때마다 실행
  useEffect(() => {
    console.log("I run when 'counter' changes.. ", counter);
  }, [counter]);

  return (
    <div>
      <h1>{counter}</h1>
      <button onClick={onClick}>click me</button>
    </div>
  );
}

export default App;

 

여러개의 state를 감지하고 싶으면 배열안에 ,(콤마)로 구분하여 넣어준다.

import { useEffect, useState } from "react";

function App() {
  const [counter, setValue] = useState(0);
  const [keyword, setKeyword] = useState("");
  const onClick = () => setValue((prev) => prev + 1);
  const onChange = (event) => setKeyword(event.target.value)

  console.log("i run all the time...");

  // 한번만 실행. 아무도 watch하지 않는다!!
  useEffect(() => {
    console.log("I run only once.")
  }, []);
  
   // keyword의 변화를 감지하여 실행
  useEffect(() => {
    if (keyword !== "" && keyword.length > 5) {
      console.log("I run when 'keyword' changes.. ", keyword);
    }
  }, [keyword]);
  
  // counter의 변화를 감지하여 실행
  useEffect(() => {
    console.log("I run when 'counter' changes.. ", counter);
  }, [counter]);
  
  // keyword와 counter의 변화를 감지하여 실행
  useEffect(() => {
    console.log("I run when 'keyword & counter' changes.. ", counter);
  }, [keyword, counter]) ;

  return (
    <div>
      <h1>{counter}</h1>
      <button onClick={onClick}>click me</button>
      <h1>
      <input 
            value={keyword}
            onChange={onChange}
            type="text"
            placeholder="Search Here.." />
    </div>
  );
}

export default App;

 

 

+

CleanUp

Componenet가 destroy될 때 실행하는 함수이다.

import { useEffect, useState } from "react";

function Hello() {
  useEffect(() => {
    console.log("Hello");
    return () => console.log("Bye");
  }, []);

  return <h1>Hello</h1>
}

function App() {
  const [showing, setShowing] = useState(true);
  const onClick = () => setShowing((prev) => !prev);
  
  return (
    <div>
      {showing ? <Hello/> : null}
      <button onClick={onClick}>{showing ? 'Hide' : 'Show'}</button>
    </div>
  )
}

export default App;

컴포넌트가 마운트 될 때 console.log("Hello"); 코드가 실행되고, 컴포넌트가 언마운트 될 때 console.log("Bye"); 코드가 실행된다.

 

 

 

😎 관련게시글

React 기본 - Component, Props, Event

 

 

반응형