import React, {creatContext, useState, useMemo} form 'react';
import axios from 'axios';
const AxiosContext = createContext();
export const AxiosProvider = ({children}) => {
const [token, setToken] = useState({token:'',});
const myAxios = useMemo(() => {
return axios.create({
headers:{
"Authorization": `Bearer ${token}`
}
})
},[token])
const value = {
axios: myAxios,
token: token,
setToken: setToken
};
// 이 부분을 통해서 value를 넘겨줌.
return (
<AxiosContext.Provider value={value}>{children}</AxiosContext.Provider>
);
}
export default AxiosContext;
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import { AxiosProvider } from './AxiosContext';
ReactDOM.render(
<AxiosProvider>
<App/>
</AxiosProvider>,
document.getElementById("root")
);
(...)
import AxiosContext from './AxiosContext';
const Login = ()=>{
const {axios, token, setToken} = useContext(AxiosContext);
const onSubmit = (e) => {
e.preventDefault();
featchAuth();
};
const featchAuth = async () => {
try {
const response = await axios.post("http:example_url.co.kr", {
id : form.id,
password : form.password
});
if(response.data.token){
setToken({token: response.data.token});
}
else{
alert('가입하지 않은 아이디거나, 잘못된 비밀번호 입니다.');
}
} catch(error){
console.log(error);
}
}
return (
(...로그인 form...)
);
}
export default Login;
🙂 useContext에 전달한 인자는 context 객체 그 자체여야 한다.
- ✅: useContext(AxiosContext)
- ❌: useContext(AxiosContext.Provider)
🙂 const {axios, token, setToken} = useContext(AxiosContext);
- AxiosContext.js에서 props로 넘겨주었던 value(axios, token, setToken)를 가져다 사용할 수 있다.
🙂 useContext를 호출한 컴포넌트는 context값이 변경되면 항상 리렌더링된다.
- AxiosContext.js에서는 useMemo를 사용하여 메모이제이제이션이 가능하도록 했다.
🛑 위의 예시는 useContext 외의 부분이 많이 생략되어있다.