context๋ฅผ ์ด์ฉํ๋ฉด ๋จ๊ณ๋ง๋ค ์ผ์ผ์ด props๋ฅผ ๋๊ฒจ์ฃผ์ง ์๊ณ ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ ์์์ ์๋๋ก (์ฆ, ๋ถ๋ชจ๋ก๋ถํฐ ์์์๊ฒ) props๋ฅผ ํตํด ์ ๋ฌ๋์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ค์ ์ ํด์ค์ผ ํ๋ props์ ๊ฒฝ์ฐ (์๋ฅผ ๋ค๋ฉด ์ ํธ ๋ก์ผ์ผ, UI ํ ๋ง) ์ด ๊ณผ์ ์ด ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค. context๋ฅผ ์ด์ฉํ๋ฉด, ํธ๋ฆฌ ๋จ๊ณ๋ง๋ค ๋ช ์์ ์ผ๋ก props๋ฅผ ๋๊ฒจ์ฃผ์ง ์์๋ ๋ง์ ์ปดํฌ๋ํธ๊ฐ ์ด๋ฌํ ๊ฐ์ ๊ณต์ ํ๋๋ก ํ ์ ์์ต๋๋ค.(์ ์ญ์ ์ฌ์ฉ)
props drilling
์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์์ฃผ ์ฌ์ฉํ๋ค. createContext()
๋ฅผ ํตํด Provider
์ Consumer
๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.Provider
๋ก ๊ฐ์ธ์ง ์ปดํฌ๋ํธ๋ Consumer
๋ก ๊ฐ์ธ์ง ํ์ ์ปดํฌ๋ํธ์์ Provider
์์ ์ค์ ํ ๊ฐ์ props
๋ก ์ ๋ฌ๋ฐ์ ์ ์๋ค.Props drilling
์ด๋ย ์ค์ฒฉ๋ ์ฌ๋ฌ ๊ณ์ธต์ ์ปดํฌ๋ํธ์๊ฒ props
๋ฅผ ์ ๋ฌํด ์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ค.props
๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ์๊ฒ๊น์ง ๋ง์ด๋ค.๋ฆฌ์กํธ context ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ค ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. createContext
๋ฉ์๋๋ฅผ ์ฌ์ฉํด context ๋ฅผ ์์ฑํ๋ค.
2. ์์ฑ๋ context ๋ฅผ ๊ฐ์ง๊ณ context Provider ๋ก ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๊ฐ์ผ๋ค.
3. vlaue
prop ์ ์ฌ์ฉํด context provider ์ ์ํ๋ ๊ฐ์ ์
๋ ฅํ๋ค.
4. context consumer ๋ฅผ ํตํด ํ์ํ ์ปดํฌ๋ํธ์์ ๊ทธ ๊ฐ์ ๋ถ๋ฌ์จ๋ค.
crateContext()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์๋ค.import { createContext } from 'react';
const MyContext = createContext();
value
๋ผ๋ Props๋ก ์ค์ ํ๋ฉด ์์ ์ปดํฌ๋ํธ๋ค์์ ํด๋น ๊ฐ์ ๋ฐ๋ก ์ ๊ทผ์ ํ ์ ์๋ค.function App() {
return (
<MyContext.Provider value="Hello World">
<GrandParent />
</MyContext.Provider>
);
}
useContext
๋ผ๋ Hook์ ์ฌ์ฉํ์ฌ Context์ ๋ฃ์ ๊ฐ์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค.import { createContext, useContext } from 'react';
function Message() {
const value = useContext(MyContext);
return <div>Received: {value}</div>;
}
function App() {
const [data, setData] = useState("Hello, World!");
return (
<>
<Header data={data} />
</>
);
}
function Header(props) {
return <FirstContent data={props.data}/>;
}
function FirstContent(props) {
return <SecondContent data={props.data}/>;
}
function SecondContent(props) {
return <ThreeContent data={props.data}/>;
}
function ThreeContent(props) {
return <p>WOW! {props.data}</p>;
}
import React, { createContext, useState } from "react";
const DataContext = createContext();
function App() {
const [data, setData] = useState("Hello, World!");
return (
<DataContext.Provider value={data}>
<Header />
</DataContext.Provider>
);
}
function Header() {
return <FirstContent />;
}
function FirstContent() {
return <SecondContent />;
}
function SecondContent() {
return <ThreeContent />;
}
function ThreeContent() {
const data = useContext(DataContext);
return <p>WOW! {data}</p>;
}
createContext()
๋ฅผ ์ฌ์ฉํ์ฌ Context ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , App ์ปดํฌ๋ํธ์์ ์์ฑํ data state ๋ฅผ DataContext.Provider
์ value
prop ์ผ๋ก ์ ๋ฌํ๋ค.useContext()
ํ
์ ์ฌ์ฉํด ์ฌ์ฉํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ์ ๋ง ๊น๋ํ๋ค!๋๋ firebase ์ nextron ์ ๊ฐ์ง๊ณ ์ฑํ
์ฑ์ ๋ง๋ค ๋ ์ ์ ์ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ์ ์ฅํ๋๋ฐ์ ์ฌ์ฉํ๋ค.
(์ฌ์ค ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ recoil ์ ์ฌ์ฉํด์ผํ๋ ์ฝ์งํ๋ค๊ฐ, ์ฝ์ง ํ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ์ ์ฅํ๋๋ฐ์๋ ์ ์ ์น ์๋ค๋ ๊ฒ์ ์์๋ค...)
๋น์ context api ๋ ์ฒ์์ด์๋ํฐ๋ผ ์์ฒญ ๋๋ฌ๊ฑฐ๋ฆฌ๋ฉด์ ๋ง๋ค์๋ ๊ธฐ์ต์ด..๐ญ
์๋๋ crateContext()
๋ฉ์๋๋ก ๊ธฐ์ด ์ํ๋ฅผ ์ค์ ํด์ฃผ๊ณ ,
๋ก๊ทธ์ธ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ด์ฐฐํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
// - AuthContext.tsx
export const AuthContext = createContext(undefined);
export const AuthContextProvider = ({ children }) => {
const [currentUser, setCurrentUser] = useState<IUser>(null);
useEffect(() => {
// ํ์ฌ ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์ ์ ๋ณด ๊ด์ฐฐ
const unsub = onAuthStateChanged(auth, user => {
setCurrentUser(user);
});
// cleanup fn
return () => {
unsub();
};
}, []);
return (
<AuthContext.Provider value={{ currentUser }}>
{children}
</AuthContext.Provider>
);
};
์ด ์๋๋ ๋ง๋ค์ด๋์ context ๋ฅผ ์ฌ์ฉํ ์ฝ๋๋ค.
function Navbar() {
const auth = getAuth();
// ํ์ฌ ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์ ์ ๋ณด
const { currentUser } = useContext(AuthContext);
.
.
.
return (
<div className="navbar">
<span className="username">
๐ข {currentUser ? currentUser.email : ""}
</span>
<button onClick={onClick}>Logout</button>
<style jsx>{`
value
์ currentUser ๋ฅผ ์ ๋ฌํด์ ๊ฑฐ์ ๋ชจ๋ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ค.