[유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 10: Context)

2024. 1. 13. 16:31·웹 프로그래밍/Next.js
반응형

섹션 10: Context

Props Drilling

TodoList 앱의 컴포넌트 트리

붉은 표시가 되어 있는 onUpdate, onDelete 함수는 TodoList 컴포넌트에 구현되어 있지만 실제로 컴포넌트에 직접적으로 필요한 함수는 아니다. App 컴포넌트에서 생성된 함수를 TodoItem으로 내려주어야 하기 때문에 구현되어 있을 뿐이다.

만약 이러한 현상이 tree depth가 깊은 앱에서 발생했다면, 의미 없이 아래 depth로 props를 내려주기만 하는 컴포넌트들이 많아지며 자연히 코드의 길이도 길어지고 코드 내용도 복잡해질 것이다.

 

Props Drilling 해결 방안: Context

Context: 자식 컴포넌트들에게 데이터를 직송으로 보내줄 수 있는 객체

 

Context 사용법

Context 생성

 

TodoContext.jsx

import { createContext } from "react";

export const TodoContext = createContext();

 

 

App 컴포넌트에서 <Context.Provider>로 props를 내려줄 컴포넌트를 감싼다.

App.jsx

  return (
    <div className="App">
      <Header />
      <TodoContext.Provider value={{ todos, onCreate, onUpdate, onDelete }}>
        <TodoEditor onCreate={onCreate} />
        <TodoList todos={todos} onUpdate={onUpdate} onDelete={onDelete} />
      </TodoContext.Provider>
    </div>
  );

 

최종적으로 아래 이미지와 같이 Context에서 각 컴포넌트에 필요한 값만 내려보내 준다.

 

 

 

예시) TodoEditor.jsx

...
export default function TodoEditor({ onCreate }) {
  const [content, setContent] = useState("");
  const inputRef = useRef();

  ...
  return (
    ...
  );
}

👇

...
import { TodoContext } from "../TodoContext";

export default function TodoEditor() {
  const { onCreate } = useContext(TodoContext);

  const [content, setContent] = useState("");
  const inputRef = useRef();

  ...

  return (
    ...
  );
}

 

그러나 체크박스를 체크/해제를 반복하며 확인해 보면 이전에 적용해 두었던 최적화가 풀리는 문제가 발생한다.

 

문제 원인

Context도 컴포넌트이기 때문에, 상위 컴포넌트인 App 컴포넌트가 변경되면 Context 컴포넌트도 리렌더링 된다. Context가 리렌더링되면 하위 컴포넌트도 모두 리렌더링되므로 위와 같은 문제가 발생한다.

이를 해결하기 위해 Context를 분리할 필요가 있다. 

 

 

최적화를 위한 Context 분리 기법 살펴보기

바뀔 필요가 있는 값만 바뀌도록 Context를 분리해 준다.

 

TodoContext.jsx

import { createContext } from "react";

export const TodoStateContext = createContext();
export const TodoDispatchContext = createContext();

 

App.jsx

  //TodoDispatchContext 내부 value 객체가 재생성되지 않도록 막는 코드(재생성되지 않는 객체를 전달해주기 위해)
  const memoizedDispatches = useMemo(() => {
    return { onCreate, onUpdate, onDelete };
  }, []);

  return (
    <div className="App">
      <Header />
      <TodoStateContext.Provider value={todos}>
        <TodoDispatchContext.Provider value={memoizedDispatches}>
          <TodoEditor />
          <TodoList />
        </TodoDispatchContext.Provider>
      </TodoStateContext.Provider>
    </div>
  );

 

TodoItem.jsx

function TodoItem({ id, isDone, createdDate, content }) {
  const { onUpdate, onDelete } = useContext(TodoDispatchContext);

 

 

 

 

출처

https://kmooc.udemy.com/course/react-next-master/learn/lecture/39610746

반응형
저작자표시 비영리 변경금지 (새창열림)

'웹 프로그래밍 > Next.js' 카테고리의 다른 글

[유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 15 ~ 16: Next.js 렌더링 2 - SSG, Next.js 렌더링 3 - ISR)  (1) 2024.01.22
[유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 14: Next.js 렌더링 1 - SSR)  (1) 2024.01.22
[유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 13: 페이지 라우터)  (0) 2024.01.21
[유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 12: Next.js 소개)  (0) 2024.01.15
[유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 8 ~ 섹션 9)  (0) 2024.01.13
[유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 2 ~ 섹션 7)  (0) 2024.01.11
'웹 프로그래밍/Next.js' 카테고리의 다른 글
  • [유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 13: 페이지 라우터)
  • [유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 12: Next.js 소개)
  • [유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 8 ~ 섹션 9)
  • [유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 2 ~ 섹션 7)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기 (505)
      • 프로그래밍 (41)
        • Programming (1)
        • C | C++ (6)
        • Java (28)
        • Python (5)
      • 웹 프로그래밍 (108)
        • HTML | CSS (5)
        • JavaScript | TypeScript (41)
        • React (25)
        • Vue.js (0)
        • Next.js (18)
        • Spring & Spring Boot (13)
        • JSP & Servlet (1)
        • DB (4)
      • 웹 프로젝트 (77)
        • 웹 프로젝트 (22)
        • 🥨스낵몰 (3)
        • 👨‍👨‍👧‍👧소셜 가계부 (26)
        • 🌜꿈 일기장 (11)
        • 🔮포트폴리오 사이트 (11)
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램 (0)
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼 (0)
        • 😺Just Meow It: 조언 사이트 (2)
        • 📕Workly: 교대근무 다이어리 (1)
      • 앱 프로그래밍 (26)
        • Flutter (24)
        • Kotlin (2)
      • Problem Solving (166)
        • 백준 (52)
        • 프로그래머스 (79)
        • SWEA (29)
      • Computer Science (40)
        • 알고리즘 (14)
        • 컴퓨터 네트워크 (18)
        • 이산수학 (8)
      • Developer (47)
        • 후기 (4)
        • 자료정리 (4)
        • 취업 | 취준 (9)
        • SSAFY (1)
        • 웹개발 교육 프로그램 (9)
        • TIL (20)
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    구현
    Til
    타입스크립트
    블로그 제작
    리액트
    Jiraynor Programming
    SWEA
    공식문서
    플러터
    자바스크립트
    프로젝트
    프로그래머스
    자바
    웹사이트
    알고리즘
    mysql
    bfs
    spring boot
    백준
    d3
    파이썬
    클론 프로젝트
    React
    Next.js
    강의내용정리
    ZeroCho
    뉴렉처
    AWS
    컴퓨터네트워크
    포트폴리오
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[유데미 | winterlood 이정환] 프로젝트로 배우는 React.js & Next.js 마스터리 클래스 강의 내용 정리 (섹션 10: Context)
상단으로

티스토리툴바