ํ๋ก ํธ์๋/React
Context API
alswlfl
2022. 11. 24. 23:45
https://ko.reactjs.org/docs/context.html
Context – React
A JavaScript library for building user interfaces
ko.reactjs.org
Context: ๋จ๊ณ๋ง๋ค ์ผ์ผ์ด props๋ฅผ ๋๊ฒจ์ฃผ์ง ์๊ณ ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ๋ฐ์ดํฐ ์ ๊ณต
๐ก React ์ ํ๋ฆฌ์ผ์ด์ ์์ props ์ ๋ฌ ๋ฐฉ์: ์์์ ์๋๋ก(๋ถ๋ชจ์์ ์์์ผ๋ก)
→ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ค์ ์ ๋ฌํด์ค์ผ ํ๋ props์ ๊ฒฝ์ฐ ํด๋น ๊ณผ์ ๋ฒ๊ฑฐ๋ก์
โญ๏ธ context ์ด์ฉํ์ฌ ํธ๋ฆฌ ๋จ๊ณ๋ง๋ค ๋ช ์์ ์ผ๋ก props๋ฅผ ๋๊ฒจ์ฃผ์ง ์์๋ ๋ง์ ์ปดํฌ๋ํธ๊ฐ ํด๋น ๊ฐ ๊ณต์ ๊ฐ๋ฅ
โ๏ธํน์ ํจ์๋ฅผ ํน์ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์ณ์ ์ํ๋ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํ๋ ์์ ์ด 3~4๊ฐ ์ด์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์ณ์ ์ ๋ฌ ํด์ผํ๋ ์ผ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ฒ๊ฑฐ๋ฌ์
→ ๋ฆฌ์กํธ์ Context API์ dispatch ์ฌ์ฉํ์ฌ ํด๊ฒฐ
Context API
- ํ๋ก์ ํธ ์์์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฐ ๋๋ ์ํ๋ฅผ ๊ด๋ฆฌ ๊ฐ๋ฅ → ๊ฐ์ ํจ์์ผ ์ ์๊ณ , ์ด๋ค ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ์คํด์ค์ผ ์ ์๊ณ , DOM์ผ ์ ์์
- ์๋ก์ด Context๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
- const UserDispatch = React.createContext(null);
- createContext์ ํ๋ผ๋ฏธํฐ์๋ Context์ ๊ธฐ๋ณธ ๊ฐ ์ค์ ๊ฐ๋ฅ(์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉ
- Provider ์ปดํฌ๋ํธ: Context์ ๊ฐ ์ ํจ
- <UserDispatch.Provider value={dispatch}>…</UserDispatch.Provider>
- value๋ผ๋ ๊ฐ ์ค์
- Provider์ ์ํด ๊ฐ์ธ์ง ์ปดํฌ๋ํธ ์ค ์ด๋์๋ ์ง Context์ ๊ฐ์ ๋ค๋ฅธ ๊ณณ์์ ๋ฐ๋ก ์กฐํํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅ
export const UserDispatch = React.createContext(null);
return (
<UserDispatch.Provider value={dispatch}>
<CreateUser
username={username}
email={email}
onChange={onChange}
onCreate={onCreate}
/>
<UserList users={users} onToggle={onToggle} onRemove={onRemove} />
<div>ํ์ฑ์ฌ์ฉ์ ์: {count}</div>
</UserDispatch.Provider>
);
- ์ด๋์๋ ์ง dispatch ๊บผ๋ด ์ธ ์ ์์
- ๋์ค์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ
- import { UserDispatch } from ‘./App’;
[์ฌ์ฉํ๊ธฐ]
import React, { useContext } from "react";
import { UserDispatch } from "./App";
const User = React.memo(function User({ user }) {
const dispatch = useContext(UserDispatch);
return (
<div>
<b
style={{ cursor: "pointer", color: user.active ? "green" : "black" }}
onClick={() => {
dispatch({ type: "TOGGLE_USER", id: user.id });
}}
>
{user.username}
</b>
<span>({user.email})</span>
<button
onClick={() => {
dispatch({ type: "REMOVE_USER", id: user.id });
}}
>
์ญ์
</button>
</div>
);
});