컴포넌트 트리에 데이터 공급
<DiaryList/>
는 3 개의 props 을 받지만, 그 중에 빨간색으로 두 개는 자신이 사용하지 않는 props 입니다.Provider
라고 공급자 역할을 하는 자식 컴포넌트에게 자신이 가지고 있는 모든 데이터를 다 줍니다.Provider
컴포넌트는 자신의 자손에 해당하는 모든 컴포넌트들에게 직접 데이터를 전달 합니다.Provider
컴포넌트에 자식 컴포넌트들로 배치되어 해당 Provider
컴포넌트가 공급하는 모든 데이터에 접근 할 수 있는 컴포넌트들의 영역을 문맥(Context) 이라고 표현 합니다.const MyContext = React.createContext(defaultValue);
<MyContext.Provider value = {전역으로 전달하고자 하는 값}>
{/* 이 Context 안에 위치할 자식 컴포넌트들 */}
<MyContext.Provider>
value
라는 props 를 받아서 그 안에있는 값을 {}
안에 있는 자식 컴포넌트들에게 전달하게 되는 기능 입니다.// export 하는 이유는, 내보내줘야 다른 컴포넌트들이 접근이 가능 합니다.
export const DiaryStateContext = React.createContext();
return (
<DiaryStateContext.Provider value={data}>
<DiaryDispatchContext>
<div className="App">
<DiaryEditor onCreate={onCreate} />
<div>전체 일기 : {data.length}</div>
<div>기분 좋은 일기 개수 : {goodCount}</div>
<div>기분 나쁜 일기 개수 : {badCount}</div>
<div>기분 좋은 일기 비율 : {goodRatio}</div>
<DiaryList onEdit={onEdit} onRemove={onRemove} />
</div>
</DiaryDispatchContext>
</DiaryStateContext.Provider>
);
const DiaryList = ({ onEdit, onRemove }) => {
const diaryList = useContext(DiaryStateContext);
{diaryList}
를 삭제 했습니다.Provider
도 결국 컴포넌트 입니다. Provider
가 재생성되면 밑에 컴포넌트까지 재생성 됩니다. <DiaryStateContext.Provider value={data, 상태변화함수 ...}>
이렇게 하게 되면,data
가 바뀔 때 마다 리렌더링이 일어나게 됩니다.DiaryStateContext
는 오직 data
만 공급하기 위해서 만들고DiaryDispatchContext
를 만듭니다.export const DiaryDispatchContext = React.createContext();
const memoizedDispatches = useMemo(() => {
return { onCreate, onRemove, onRemove };
}, []); // 재생성되지 않게 빈 배열 저달
return (
<DiaryStateContext.Provider value={data}>
<DiaryDispatchContext value={memoizedDispatches}>
<div className="App">
<DiaryEditor onCreate={onCreate} />
<div>전체 일기 : {data.length}</div>
<div>기분 좋은 일기 개수 : {goodCount}</div>
<div>기분 나쁜 일기 개수 : {badCount}</div>
<div>기분 좋은 일기 비율 : {goodRatio}</div>
<DiaryList />
</div>
</DiaryDispatchContext>
</DiaryStateContext.Provider>
);
const DiaryEditor = () => {
const { onCreate } = useContext(DiaryDispatchContext);
{ onCreate}
가져옵니다.DiaryDispatchContext
공급하고 있는 값은 함수 3개로 이루어진 객체이기 때문에 비구조화 할당으로 가져옵니다.