import {createContext} from 'react';
const ColorContext = createContext({ color: 'black'});
export default ColorContext;
Consumer : state를 props로 받는 것이 아닌 Consumer 컴포넌트를 통해 조회
Consumer 사이에 중괄호를 열어 함수전달. children이 아닌 함수를 전달한다.
직접 변수를 사용하는 곳에 사용
파라미터인 value는 ColorContext의 값
import ColorContext from '../contexts/color'
const ColorBox = () => {
return (
{value => (
background: value.color // black
)}
)
}
return (
<ColorContext.Provider value={{color : 'red'}}>
<div>
<ColorBox />
</div>
</ColorContext.Provider>
)
context 수정
const ColorContext = createContext({
state : { color : 'black', subcolor : 'red'}
actions : {
setColor: ()=> {},
setSubcolor: () => {}
}
})
const ColorProvider = ({children}) => {
const [color, setColor] = useState('black')
const [red, setRed] = useState('red')
const value = {
state: {color, subcolor},
actions : {setColor, setSubcolor}
};
return (
// 이렇게 하면서 ColorContext.Provider 대신 ColorProvider로 사용 가능
<ColorContext.Provider value={value}>{children}</ColorContext.Provider>
)
}
// const ColorConsumer = ColorContext.Consumer
// Consumer 쓸 때 ColorContext.Consumer를 colorConsumer로 대체 가능하다.
const { Consumer: ColorConsumer } = ColorContext;
// ColorProvider는 ColorContext.Provider를 반환하면서 ,
// ColorConsumer는 const { Consumer: ColorConsumer } = ColorContext;를 통해서 사용 가능
export {ColorProvider, ColorConsumer} ;
export default ColorContext;
App.js에 ColorProvider, ColorBox.js에서 ColorConsumer로 교체
ColorBox.js
return (
{value => (
<>
<div
background : value.state.color
/>
<div
background : value.state.subcolor
/>
<>
)}
)
SelectColor.js 파일 생성
const colors = ['red', 'orange', 'yellow', 'green']
<ColorConsumer>
{({actions}) => (
{colors.map(color => (
<div
key={color}
onClick={()=>actions.setColor(color)}
onContextMenu= {e =>
e.preventDefault();
actions.setSubcolor(color)}
>
))}
)}
</ColorConsumer>
// const {state} = value; === state => value.state
<ColorConsumer>
{({state}) => ( ... )}
</ColorConsumer>
// {state } = value.state
const { state } = useContext(ColorContext)