Context API는 크게 전역 상태가 저장되는 context, 전역 상태를 제공하는 Provider, 그리고 전역 상태를 받아 사용하는 Consumer로 나뉘어져 있다.
context 안에는 Provider와 Consumer가 정의되어 있으며 다른 컴포넌트에서는 이것들을 이용해 상태에 접근합니다.
import React from 'react'
export default React.createContext({}) // 함수의 인자에는 상태의 초기값이 들어갑니다.
import ShopContext from './path/to/shop-context'; // React.createContext() 객체
class App extends Component {
render() {
return (
<ShopContext.Provider value={{
products: [],
cart: []
}
}>
{/* 이곳 Provider 사이에 있는 컴포넌트는 전역 상태에 접근할 수 있습니다. */}
</ShopContext.Provider />
);
}
}
import ShopContext from '../context/shop-context' // React.createContext() 객체
class ProductsPage extends Component {
render() {
return (
<ShopContext.Consumer> { }
{context => (
<React.Fragment>
<MainNavigation
cartItemNumber={context.cart.reduce((count, curItem) => {
return count + curItem.quantity
}, 0)}
/>
<main className="products">...</main>
</React.Fragment>
)}
</ShopContext.Consumer>
)
}
}
export default ProductsPage
import ShopContext from '../context/shop-context'
class CartPage extends Component {
static contextType = ShopContext
componentDidMount() {
// 별도의 복잡한 코드 작성 없이 다른 컴포넌트에서 해당 상태에 접근할 수 있습니다.
console.log(this.context)
}
render() {
return (
<React.Fragment>
<MainNavigation
cartItemNumber={this.context.cart.reduce((count, curItem) => {
return count + curItem.quantity
}, 0)}
/>
<main className="cart">...</main>
</React.Fragment>
)
}
}
export default CartPage
Context API에서는 상태의 갱신을 위해서는 하위 컴포넌트에 Props에 함수를 전달한 것처럼 value를 Provide한 것처럼 상태의 갱신을 위한 함수도 value와 함께 Provide하여 하위 컴포넌트에서 사용해야 한다.
Context API
Redux
상태관리 측면에서만 본다면 Context API와 Redux의 성능 차이는 크게 없다. 하지만 Redux는 Context API와 다르게 전역 상태 관리외에 다양한 기능을 제공한다. 따라서 오직 전역의 상태 관리만을 위해 사용한다면 Context API, 그 외의 추가적인 기능을 필요로 한다면 Redux를 사용하면 좋다.
참고: https://academind.com/tutorials/reactjs-redux-vs-context-api/