Hazel Han
Midnight In Coding
Hazel Han
전체 방문자
오늘
어제
  • 분류 전체보기 (46)
    • Back-end (6)
      • java (0)
      • spring frameworks (6)
      • spring boot (0)
    • Front-end (29)
      • React (7)
      • Javascript (0)
      • html (7)
      • css (15)
    • DB (0)
    • Algorithms (2)
    • 회고록 (9)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 남궁성
  • 코딩
  • 스프링프레임워크
  • 프로그래밍
  • 리액트
  • 스프링
  • Java
  • 자바
  • coding
  • 자바의정석
  • 회고록
  • justcode
  • 기술블로그
  • React
  • springframeworks
  • 저스트코드
  • css
  • 개발자
  • HTML
  • Spring

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Hazel Han

Midnight In Coding

Front-end/React

[JUSTCODE] Basic Foundation - React useEffect

2022. 10. 24. 22:05

Side Effect

"부수효과"로, 내가 원하던 결과 값 이외에 발생한 다른 결과를 의미한다.

 

ex)

let count = 0

function greetWithSideEffect(name) { // Input
	count = count + 1 // Side Effect!

	return `${name}님 안녕하세요!` // Output
}

내가 원하던 결과인 return문 외에 count가 하나씩 올라가는 효과를 얻었기 때문에 count는 Side Effect라고 할 수 있다.

 

만약, UI를 그려내는 렌더링이 원하던 결과였다면, UI를 그려내는 활동을 제외한 모든 것은 Side Effect라고 할 수 있다. 대표적으로는 data fetching, DOM에 직접 접근, 구독(setInterval)등이 있다.

 

이런 Side Effect는 함수의 body자리에서 실행하면 안된다. 함수는 state, props의 변화가 발생할 때 마다 실행되기 때문에 매 렌더링 때마다 body의 로직이 실행된다. 따라서 body자리에 Side Effect를 넣으면 렌더링 할 때마다 Side Effect 또한 실행되기 때문에 렌더링의 성능에 악영향을 끼칠 수 있기 때문이다.

 

 

useEffect

위에서 서술한 Side Effect의 영향 때문에 React에서 만들어진 것이 바로 useEffect Hook이다. useEffect는 Side Effect를 렌더링 이후에 실행되기 때문에 렌더링에 영향을 주지 않는다.

 

ex)

import { useEffect } from 'react';

function GreetWithSideEffect({ name }) { // Input
  useEffect(() => {
    // Good!
    document.title = `${name}님 안녕하세요!`; // Side Effect
  }, [name]);

  return <div>{`${name}님 안녕하세요!`}</div>; // Output
}

 

사용방법

import { useEffect } from "react"

// 사용법
useEffect( 실행시킬 동작, [ 타이밍 ] )
document.addEventListener("타이밍", 실행시킬 동작) // 추상화 한 예시

// 매 렌더링마다 Side Effect가 실행되어야 하는 경우
useEffect(() => {
  // Side Effect
})

// Side Effect가 첫 번째 렌더링 이후 한번 실행 되고,
// 이후 특정 값의 업데이트를 감지했을 때마다 실행되어야 하는 경우
useEffect(() => {
  // Side Effect
}, [value])

// Side Effect가 첫 번째 렌더링 이후 한번 실행 되고,
// 이후 어떤 값의 업데이트도 감지하지 않도록 해야 하는 경우
useEffect(() => {
  // Side Effect
}, [])

 

 

Clean up Effect

이전에 발생한 Side Effect를 없애고 싶을 때 사용.

 

사용방법

useEffect(() => {
	function handleScroll() {
		console.log(window.scrollY)
	}

	document.addEventListener("scroll", handleScroll)
	return () => {
		document.removeEventLisnter("scroll", handleScroll)
	}
}, [])

useEffect 안에 해당 로직을 없애는 동작을 넣어주면 된다. 

 

저작자표시 (새창열림)

'Front-end > React' 카테고리의 다른 글

[JUSTCODE] Advanced Foundation - React 재사용 컴포넌트  (0) 2022.10.29
[JUSTCODE] Advanced Foundation - React (리)렌더링, 조건부 렌더링  (0) 2022.10.29
[JUSTCODE] Basic Foundation - React useState, props  (0) 2022.10.24
[JUSTCODE] Basic Foundation - React Router, Saas  (0) 2022.10.20
[JUSTCODE] Basic Foundation - React CRA, Component, JSX  (0) 2022.10.20
    'Front-end/React' 카테고리의 다른 글
    • [JUSTCODE] Advanced Foundation - React 재사용 컴포넌트
    • [JUSTCODE] Advanced Foundation - React (리)렌더링, 조건부 렌더링
    • [JUSTCODE] Basic Foundation - React useState, props
    • [JUSTCODE] Basic Foundation - React Router, Saas
    Hazel Han
    Hazel Han

    티스토리툴바