Prop
- 컴포넌트 계층 구조에서 상위 컴포넌트로부터 하위 컴포넌트로 데이터를 전달하는 표준 방법
- 일반적으로 부모와 자식 컴포넌트 사이의 직접적인 데이터 전달에 가장 적합
prop drilling
이라는 문제를 초래할 수 있음
- 데이터를 여러 계층의 컴포넌트를 통해 전달해야 할 때 발생하는 문제로,
코드가 복잡해지고 유지 관리가 어려워질 수 있습니다.
useContext
- 컴포넌트 트리의 모든 레벨에서 props를 통해 수동으로 전달하지 않고도 데이터에 접근할 수 있음
- 애플리케이션의 전반적인 상태를 관리하거나, 많은 수의 컴포넌트가 동일한 데이터를 필요로 할 때 유용
- context는 오버헤드가 있으므로 모든 상황에서 사용하는 것이 좋은 방법은 아니다.
// ToggleContext.jsx
// Context 객체 생성
import { createContext } from "react";
export const ToggleContext = createContext(null);
// App.js
// Provider를 사용하여 모든 자식 컴포넌트에 값을 공유
import { useState } from 'react';
import Test from "./components/Test";
import { UserContext } from "./context/UserContext";
function App() {
const [isToggle, setIsToggle] = useState(false);
return (
<ToggleContext.Provider value={{isToggle, setIsToggle}}>
<Test />
</ToggleContext>
)
}
export default App;
// Test.jsx
import React, { useContext } from 'react';
import { ToggleContext } from '../context/ToggleContext';
const Test = () => {
const { isToggle, setIsToggle } = useContext(ToggleContext);
return (
<div>
{isToggle ? 'O' : 'X'}
<button onClick={() => setIsToggle(!isToggle)}>클릭</button>
</div>
);
};
export default Test;
// UserContext.jsx
export const UserContext = createContext('홍길동');
// App.js
function App() {
return (
<Test />
)
}
// Test.jsx
const name = useContext(UserContext);
// App.js
function App() {
return (
<ThemeContext.Provider value={'light'}>
<UserContext.Provider value={'홍길동'}>
<Test />
</UserContext.Provider>
</ThemeContext.Provider>
)
}
// CombinedProvider.jsx
function CombinedProvider({ providers, children }) {
return providers.reduce((prev, curr) => React.cloneElement(curr, { children: prev }), children);
}
// App.js
function App() {
return (
<CombinedProvider
providers={[
<ThemeContext.Provider value={'light'} />,
<UserContext.Provider value={'홍길동'} />
]}
>
<Test />
</CombinedProvider>
)
}