front-end/React

One-way reactive data flow 와 Context API

Hoon0211 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