Context API를 사용한 전역 상태 관리 흐름
- 프로젝트 내에서 환경설정, 사용자정보같은 전역적으로 필요한 상태는 어떻게 관리??
 
- 리액트 애플리케이션은 컴포넌트 간에 데이터를 props로 전달하기 때문에 컴포넌트 여기저기서 필요한 데이터가 있을 때는 주로 최상위 컴포넌트인 App
 

- G컴포넌트 : 전역상태를 업데이트 시킨다.
 
- F, J컴포넌트 : 업데이트 된 상태를 렌더링 한다.
 
- 즉, App컴포넌트에서는
 
const [value, setValue] = useState('hello');
const onSetValue = useCallback(value => setValue(value), []);
Context API
import {createContext} from 'react';
const ColorContext = createContext({color: 'black'});
export default ColorContext;
- ColorBox 라는 컴포넌트를 만들어서 ColorContext 안에 있는 색상을 보여준다
 
- 이때 색상은, props로 받아오는 것이 아니라 ColorContext 안에 들어있는 Consumer 라는 컴포넌트를 통해 색상을 조회
 
import ColorContext from '../contexts/color';
const ColorBox = () => {
  
  return (
    <ColorContext.Consumer>
      {value => (
         <div 
       		style={{
      		  width: '64px',
       		  height: '64px',
       		  background: value.color
      		}}
         />
       )}
    </ColorContext.Consumer>
  );
};
** Render Props 예제 **
  
  const RenderPropsSample = ( {children} ) => {
    
    return (
      <div>
        결과: {children(5)}
      </div>
    );
  };
  export default RenderPropsSample;
	- 위와 같은 컴포넌트가 있다면 추후 사용할 때,
  
  <RenderPropsSample>{value => 2*value}</RenderPropsSample>
	- 이렇게 사용할 수 있는데, RenderPropsSample 에게 children props로 파라미터에 2를 곱해서 반환하는 함수를 전달하면 해당 컴포넌트에서는 이 함수에 5를 인자로 넣어서 "결과: 10" 을 렌더링한다.
    
- ColorBox 컴포넌트를 App에서 렌더링하자,
 
import ColorBox from './components/ColorBox';
const App = () => {
  
  return (
    <div>
      <ColorBox />
    </div>
  );
};
export default App;
import ColorBox from './components/ColorBox';
import ColorContext from './contexts/color';
const App = () => {
  
  return (
    <ColorContext.Provider
      value={{color: 'red'}}
  	>
      <div>
        <ColorBox />
      </div>
	</ColorContext.Provider>
  );
};
export default App;
- Provider를 사용하면 Context의 value를 변경할 수 있다.
- 기존 createContext함수 사용했을 때는 파라미터로 Context의 기본값을 넣었고,
- 이 디폴트값은 Provider를 사용하지 않았을 때만 사용된다.
- Provider 사용했는데 value를 명시하지 않았다면 오류발생