JSX 파일 생성.
컴포넌트 기본 골격 생성.
createContext()
를 담은 변수를 생성. (export를 붙여주자)
컴포넌트의 props에 children
을 전달.
외부로 전달하고 싶은 state를 생성.
위에 생성한 <context 변수명.Provider>
로 감싼 {children props}
를 return 한다.
return <createContext()를 담은 변수.Provider>
{children}
</createContext()를 담은 변수.Provider>
context.Provider
에 value
속성으로 전달하고자 하는 state를 넣는다.<createContext()를 담은 변수.Provider value = {{state}}>
{children}
</createContext()를 담은 변수.Provider>
<context.jsx>
import React, { createContext, useEffect, useState } from "react";
// context 생성
export const JSONData = createContext();
// children props 전달
export default function JsonPlaceHolder({ children }) {
// 공유하고자 하는 state 생성
const [jsonData, setJsonData] = useState([]);
async function getJson() {
let res = await fetch(`https://jsonplaceholder.typicode.com/todos/1`);
let data = await res.json();
setJsonData((prev) => [...prev, data]);
}
useEffect(() => {
getJson();
}, []);
// 반환 값
return <JSONData.Provider value={{ jsonData }}>{children}</JSONData.Provider>;
}
<App.jsx>
import './App.css';
import ContextTest from './components/Context';
import JsonPlaceHolder from './context/JsonPlaceHolder';
function App() {
return (
<div className="App">
<JsonPlaceHolder>
<ContextTest />
</JsonPlaceHolder>
</div>
);
}
export default App;
useContext()
를 사용한다. (구조분해 할당 가능)createContext()를 할당했던 변수
이다.<ContextTest.jsx>
import React, { useContext } from "react";
// createContext() 변수 import
import { JSONData } from "../context/JsonPlaceHolder";
export default function ContextTest() {
// context.Provider의 value로 전달한 값을 가져온다.
// 구조분해 할당을 사용하지 않으면 객체 형태로 온다
// ex) const data = useContext(JSONData); // {jsonData: Array(2)}
const { jsonData } = useContext(JSONData); // (2) [{…}, {…}]
return (
<div>
<h3>-context API-</h3>
<h4>
이것은 contextAPI를 활용해 가져온 데이터 입니다:
{jsonData?.map((el, i) => {
return (
<div key={i}>
<h4>오늘의 할 일 {i+1}</h4>
<p>{el.title}</p>
<h4>완료 상태</h4>
<p>{el.completed}</p>
</div>
);
})}
</h4>
</div>
);
}