728x90
반응형

전 글에서 설명할 때 

 

1. 상위 컴포넌트에서 내보내고,

export const UserDispatch = React.createContext(null);

 

 

 

2. 감싸고,

  return (
    <UserDispatch.Provider value={dispatch}>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onToggle={onToggle} onRemove={onRemove} />
      <div>활성사용자 수 : {count}</div>
    </UserDispatch.Provider>
  );

 

 

 

 

3. 하위 컴포넌트에서 import 하고,

import { UserDispatch } from './App';

 

 

4. 하위 컴포넌트에서 useContext로 가져왔다.

const User = React.memo(function User({ user }) {
  const dispatch = useContext(UserDispatch);

 

 

 

 

이 방법이 잘못된건 아니지만, 다른 방법도 있어서 설명하겠다.

 

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

export function TodoProvider({ children }) {
  const [state, dispatch] = useReducer(todoReducer, initialTodos);
  return (
    <TodoStateContext.Provider value={state}>
      <TodoDispatchContext.Provider value={dispatch}>
        {children}
      </TodoDispatchContext.Provider>
    </TodoStateContext.Provider>
  );
}

export function useTodoState() {
  return useContext(TodoStateContext);
}

export function useTodoDispatch() {
  return useContext(TodoDispatchContext);
}

먼저 상위 컴포넌트에서 위 코드가 같이 선언해준다.

 

 

 

1. 먼저 state 와 dispatch가 담길 Context를 선언해준다.

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

 

 

2. 그 다음 다른 컴포넌트에서 import 할 함수들을 정의한다.

export function useTodoState() {
  return useContext(TodoStateContext);
}

export function useTodoDispatch() {
  return useContext(TodoDispatchContext);
}

 

 

3. 그 다음 Context를 사용 할 하위 컴포넌트들을 감싼다

export function TodoProvider({ children }) {
  const [state, dispatch] = useReducer(todoReducer, initialTodos);
  return (
    <TodoStateContext.Provider value={state}>
      <TodoDispatchContext.Provider value={dispatch}>
        {children}
      </TodoDispatchContext.Provider>
    </TodoStateContext.Provider>
  );
}

 

 

4. 그 다음 하위 컴포넌트에서 import하여 사용한다.

import React from 'react';
import { useTodoState, useTodoDispatch } from '../TodoContext';

function Sample() {
  const state = useTodoState();
  const dispatch = useTodoDispatch();
  return <div>Sample</div>;
}

 

 

차이점은

- useContext를 하위컴포넌트에서 사용하냐, 

- useContext를 상위컴포넌트에서 사용하여 Context가 return되는 함수를 정의하고 하위 컴포넌트에서 이 함수를 하위

   컴포넌트에서 사용하냐 이다.

 

사용하기 나름이라 편한걸로 쓰면 될 것 같다.

 

 

728x90
반응형

'Front-End > React.js' 카테고리의 다른 글

React.js | API 연동 | 기본  (0) 2021.10.07
React.js | 입문 | Immer  (0) 2021.09.17
React.js | 입문 | Context API 전역 값 관리(1)  (0) 2021.09.17
React.js | 입문 | React.memo  (0) 2021.09.17
React.js | 입문 | useCallback  (0) 2021.09.17

+ Recent posts