프론트엔드/React

[React] 8. Effects

sujin7837 2022. 12. 18. 20:15
반응형

state가 변화할 때 모든 component가 다시 실행되고, code들도 다시 실행됩니다. 그러나 component 내의 몇몇 코드들은 처음 한 번만 실행되고 다시 실행되지 않도록 할 필요가 있습니다. 이럴 때 Effect를 사용해주면 됩니다.

 

아래 코드에서 "call an api"는 한 번만 실행하면 되는 로그입니다. 그러나 버튼을 클릭할 때마다 항상 실행됩니다.

import { useState } from "react";

function App() {
  const [counter, setValue] = useState(0);
  const onClick = () => setValue((prev) => prev + 1);
  console.log("call an api");

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

export default App;

 

useEffect

useEffect를 사용하면 코드가 처음 실행될 때 한 번만 실행되고, state가 바뀌어도 다시 실행되지 않습니다.

import { useState, useEffect } from "react";

function App() {
  const [counter, setValue] = useState(0);
  const onClick = () => setValue((prev) => prev + 1);
  console.log("i run all the time");	// state가 변화하면 항상 실행됨
  const iRunOnlyOnce = () => {
    console.log("i run only once");	// state가 변화해도 처음 한 번만 실행됨
  }
  useEffect(iRunOnlyOnce, []);
  useEffect(()=>{
    console.log("CALL THE API...");	// state가 변화해도 처음 한 번만 실행됨
  }, []);

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

export default App;

 

useEffect(() => {코드}, [지켜볼 대상]);

지켜볼 대상이 없으면, 코드는 한 번만 실행됩니다.

지켜볼 대상이 있으면, 코드는 그 대상이 변화할 때마다 실행됩니다.

 

따라서 useEffect를 이용하면 컴포넌트 변화에 따른 코드 실행을 변화시킬 수 있습니다.

 

function Hello() {
  useEffect(() => {
    console.log("created :)");	// 컴포넌트가 생성될 때 실행됨
    return ()=>console.log("destroyed :(");	// 컴포넌트가 소멸될 때 실행됨
  }, []);
  return <h1>Hello</h1>;
}

위 코드를 통해 컴포넌트가 언제 생성되고, 언제 소멸되는지를 확인할 수도 있습니다.

 

function Hello() {
  function byFn() {
    console.log("bye : (");
  }
  function hiFn() {
    console.log("created :)");
    return byFn;
  }
  useEffect(hiFn, []);
  return <h1>Hello</h1>;
}

React.js가 hiFn을 실행하고, component가 파괴될 때에 React.js는 hiFn이 return한 byFn을 실행합니다.

 

즉, useEffect를 사용하면 시작할 때만 code를 실행하게 할 수도 있고, 무언가가 변화할 때 code가 실행되게 할 수도 있고, component가 파괴될 때 code가 실행되게 할 수도 있습니다.

 

useEffect를 사용한 예시

import { useState, useEffect } from "react";

function Hello() {
  useEffect(() => {
    console.log("hi: )");
    return ()=> console.log("by :(");
  }, []);
  useEffect(function() {
    console.log("hi: )");
    return function() {
      console.log("by :(");
    }
  }, []);
  return <h1>Hello</h1>;
}

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

export default App;

 

 

출처 : 노마드코더

반응형

'프론트엔드 > React' 카테고리의 다른 글

[React] 6. Memo  (0) 2022.12.04
[React] 5. Props  (0) 2022.12.04
[React] 4. State  (0) 2022.11.22
[React] 3. JSX  (0) 2022.11.13
[React] 2. Before React  (0) 2022.11.13