Consumer
컴포넌트 없이 Context
사용하기
이럴 때
Context API
를 사용하면 컴포넌트의 중첩 구조가 복잡한 상황에서도 비교적 쉽게 데이터를 전달할 수 있다
Context API
를 사용하면 중간 컴포넌트가 개입하지 않고도 props를 전달할 수 있다.
import React, { useContext } from 'react';
const Main = () => {
const [user, setUser] = useState({userName: 'yrKim' , userID: 'april5'})
const UserContext = createContext(user); // (1)
return (
<UserContext.Provider value={user}> // (2)
<MyPage /> // 하위에 <Profile />가 있음
</UserContext.Provider>
);
};
const Profile = () => {
const user = useContext(UserContext); // (3)
return (
<div>
<p>{`${user.userName}님 안녕하세요:)`}</p>
</div>
);
};
(1) Context API
생성 createContext('초기값')
(2) Provider
로 감싸서 데이터 전달하기.
value
전달할 때 새로운 객체가 만들어지지 않도록 해야 불필요한 렌더링을 방지할 수 있다.
(3) 전달받은 데이터 사용. useContext
를 사용하여 전달 받은 값을 가져올 수 있다.
Context API
로 전달받은 데이터를 하위 컴포넌트에서 수정할 수 있다.
import React, { useContext } from 'react';
const Main = () => {
const [user, setUser] = useState({userName: 'yrKim' , userID: 'april5'})
const UserContext = createContext(user);
const SetUserContext = createContext(() => {}); // (1)
return (
<SetUserContext.Provider value={setUser}> // (2)
<UserContext.Provider value={user}>
<MyPage /> // 하위에 <Profile />가 있음
</UserContext.Provider>
</SetUserContext.Provider>
);
};
const Profile = () => {
const user = useContext(UserContext);
const setUser = useContext(SetUserContext); // (3)
return (
<div>
<p>{`${user.userName}님 안녕하세요:)`}</p>
<button onClick={() => setUser(/* 변경 로직 */)}></button>
</div>
);
};
(1) 생성 createContext(() => {})
(2) Provider
로 감싸서 데이터 전달하기.
(3) 전달받은 함수 사용. useContext
를 사용하여 전달 받은 함수를 가져올 수 있다.
value
에 새로운 객체가 만들어지지 않도록 해야 불필요한 렌더링을 방지할 수 있다Provider
를 찾지 못하는 경우 대응Consumer
컴포넌트와 Provider
컴포넌트를 적절한 위치에서 사용하지 않으면 Context API 데이터가 전달되지 않는다.Consumer
컴포넌트가 Provider
컴포넌트를 찾지 못하는 경우가 발생하는데, 그럴 경우를 대비해서 초기값을 셋팅해두자.