ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • One-way reactive data flow 와 Context API
    front-end/React 2023. 8. 11. 14:13
    728x90

    1. 단방향 데이터 흐름(one-way reactive data flow)의 장단점

    • 단방향 데이터의 장점 
      • 관리가 용이하다
      • DOM가 궁합이 좋다
      • 안정성이 보장이 된다.
         
    • 단방형 데이터 단점
      • 자식요소에서 부모요소로 데이터를 바로 전달할 수 없다

     

    - props로 데이터 전달하면 생기는 문제점은?

    • 최하단 컴포넌트에서 최상단 있는 컴포넌트에 데이터를 전달할 경우
      여러 컴포넌트를 연달아서 props를 전달해야 한다(props drillong)
    • 하위 > 상위 데이터 전달하는 과정 복잡하며, 많은 단계를 진행 할수록 실수도 잦아진다.
      • context 라는 데이터 보관함을 통해 전역적으로 관리하는 방법이 나왔다.

     

     

    2. Context API 장단점

    • 장점
      • 전역 상태 관리에 용이하다.
      • 중첩 컴포넌트에 건편한 전달이 가능하다.
      • 컴포넌트 분리 및 재사용성이 높다.
         
    • 단점
      •  복잡한 데이터 구조나 깊은 중첩 구조에서 관리하기 어려울 수 있다.
      • Context 값이 변할때 마다 하위 컴포넌트가 불필요한 렌더링이 재실행될 수 있다.
      • 디버깅 하기 어려우며, 어떤 컴포넌트 값이 변경 여부의 확인이 어렵다.

     

     

     

    3. context 사용 방법

    • context 파일을 생성해준다. (createContext) => export
    • context를 사용할 컴포넌트에 import
    • 전역적으로 관리해줄 컴포넌트를 Context.Provider로 감싸준다.
    • 데이터를 받아올 컴포넌트에서는 useContext 함수를 이용한다.

     

    - 1. context 폴더 생성

     

    - 2. context 파일 생성

    // ColorContext.js 파일
    import { createContext } from "react";
    export const ColorContext = createContext(null)

     

    - 3.context 사용

    //App1.js 파일
    import React, { useState } from 'react'
    import ColorResult from './components/ColorResult'
    import ColorList from './components/ColorList'
    import { ColorContext } from './context/ColorContext'
    const App1 = () => {
    
        const [myColor, setMyColor] = useState('black')
        return (
            <ColorContext.Provider value={{ myColor, setMyColor }}>
                <div>
                    <h1>색상 변경하기</h1>
                    <ColorList />
                    <hr />
                    <h1>선택한 색상</h1>
                    <ColorResult />
                </div>
            </ColorContext.Provider>
        )
    }
    export default App2

     

    - 4. components 파일들

    //ColorList.jsx 파일
    import React, { useContext } from 'react'
    import { ColorContext } from '../context/ColorContext'
    
    const ColorList = () => {
        let color = ['red', 'orange', 'yellow', 'green', 'blue'];
    
        const { setMyColor } = useContext(ColorContext);
        return (
            <div style={{ display: 'flex' }}>
                {color.map(item =>
                    <div onClick={(e) => { setMyColor(e.target.style.backgroundColor) }}
                        key={item} style={{
                            width: '100px',
                            height: '100px',
                            backgroundColor: `${item}`
                        }}></div>
                )}
            </div>
        )
    }
    export default ColorList
    // ColorResult.jsx 파일
    import React, { useContext } from 'react'
    import { ColorContext } from '../context/ColorContext'
    
    const ColorResult = () => {
      const {myColor} = useContext(ColorContext);
      return (
        <div style={{
            width: '100px', 
            height :'100px', 
            backgroundColor : `${myColor}`}}></div>
      )
    }
    export default ColorResult

     

    5. 결과

     

    728x90

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

    React Redux state 변경하기  (0) 2023.10.15
    React Redux 설치, 세팅, 사용하기  (0) 2023.10.15
    ES7+ React 확장 프로그램 단축키  (0) 2023.08.08
    React 에서 이미지 가져오기(img태그)  (0) 2023.08.07
    React State  (0) 2023.08.07
Designed by Tistory.