๐Ÿ“

15. Context(ContextAPI)

props์™€ context

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” useContext์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ด…์‹œ๋‹ค!
ย 
์œ„๋‹ˆ๋ธŒ์œ„๋‹ˆ๋ธŒ
์œ„๋‹ˆ๋ธŒ
ย 
๋ณดํ†ต ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค„ ๋•Œ props๋ฅผ ํ†ตํ•˜์—ฌ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค. ์œ„์— ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณผ๊นŒ์š”?
  1. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋ ค๋ฉด props๋กœ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๊ณ  ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” props๋ฅผ ํ†ตํ•ด ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  1. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์† ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์ค„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ• ๊นŒ์š”? ์ž์‹์—๊ฒŒ ์ „๋‹ฌํ•ด์ค€ ๋ฐฉ๋ฒ• ๊ทธ๋Œ€๋กœ, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ props๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ , ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.
  1. ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋„˜๊ฒจ์ฃผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ๋˜‘๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.
ย 
๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹์—๊ฒŒ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ , ์ž์‹์€ ๋˜ ์ž์‹์—๊ฒŒ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋˜์ฃ !
์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” props ์ „๋‹ฌ์€ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ ธ์„œ ๋ถ€๋ชจ๊ฐ€ n๋ฒˆ์งธ ์ž์†์—๊ฒŒ ๋„˜๊ฒจ์ค˜์•ผ ํ•œ๋‹ค๋ฉด n-1๊ฐœ์˜ ์ž์†์—๊ฒŒ props๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ „๋‹ฌ์„ ์œ„ํ•ด์„œ ๋ง์ด์ฃ ! ๊ณ„์†ํ•ด์„œ ๋ถˆํ•„์š”ํ•œ props๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ณ  ์˜๋ฏธ ์—†๋Š” ๊ฐ’๋“ค์ด ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์Šค์ณ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ context์ž…๋‹ˆ๋‹ค!
context๋Š” props๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. props๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  n๋ฒˆ์งธ ์ž์†์—๊ฒŒ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑด๋‚ด์ค๋‹ˆ๋‹ค. n-1๊ฐœ์˜ ์ž์‹์„ ํ†ต๊ณผํ•˜์—ฌ n๋ฒˆ์งธ ์ž์‹์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„๋„ ๋ถ€๋ชจ์—์„œ ๋ฐ”๋กœ n๋ฒˆ์งธ ์ž์‹์—๊ฒŒ ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
props์— ๋Œ€ํ•œ ์ „์—ญ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
ย 

props๋กœ ์ „๋‹ฌ

import React from "react"; const App = () => { return ( <HelloLicat value={{ name: "gary", id: "garyIsFree" }} /> ); }; const HelloLicat = (props) => { const id = props.value.id; const name = props.value.name; return ( <div> <h2>{id}</h2> <strong>{name}</strong> </div> ); }; export default App;
src / App.js

props๋กœ ์ž์†์—๊ฒŒ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

import React from "react"; const App = () => { return ( <HelloLicat value={{ name: "gary", id: "garyIsFree" }} /> ); }; const HelloLicat = (props) => { const id = props.value.id; const name = props.value.name; return ( <div> <h2>{id}</h2> <strong>{name}</strong> <HelloLicatTwo value={{ id, name}}/> </div> ); }; const HelloLicatTwo = (props) => { const id = props.value.id; const name = props.value.name; return ( <div> <h2>Two : {id}</h2> <strong>Two : {name}</strong> </div> ); }; export default App;
src / App.js

contextAPI

context ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

1) Context ์ƒ์„ฑ
createContext๋กœ context๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์ „๋‹ฌํ•ด์ค„ ์ปดํฌ๋„ŒํŠธ์— Context.Consumer ํ˜•์‹์œผ๋กœ ๊ฐ์‹ธ์ฃผ๊ณ  UserInfo ์•ˆ์— ์žˆ๋Š” Consumer๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด value ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
import React, { createContext } from "react"; const UserInfo = createContext({ name: "gary", id: "garyIsFree" }); const App = () => { return ( <HelloLicat/> ); }; const HelloLicat = () => { return ( <UserInfo.Consumer> {(value) => ( <div> <h2>{value.name}</h2> <strong>{value.id}</strong> </div> )} </UserInfo.Consumer> ); }; export default App;
src / App.js

props๋กœ ์ž์†์—๊ฒŒ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

import React, { createContext } from "react"; const UserInfo = createContext({ name: "gary", id: "garyIsFree" }); const App = () => { return ( <HelloLicat/> ); }; const HelloLicat = () => { return ( <UserInfo.Consumer> {(value) => ( <div> <h2>{value.name}</h2> <strong>{value.id}</strong> <HelloLicatTwo/> </div> )} </UserInfo.Consumer> ); }; const HelloLicatTwo = () => { return ( <UserInfo.Consumer> {(value) => ( <div> <h2>{value.name}</h2> <strong>{value.id}</strong> </div> )} </UserInfo.Consumer> ); }; export default App;
src / App.js
2) Context.Provider๋กœ ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ
import React, { createContext } from "react"; const UserInfo = createContext({ name: "gary", id: "garyIsFree" }); const App = () => { return ( <UserInfo.Provider value={{ name: "Licat", id: "ImLion" }}> <HelloLicat /> </UserInfo.Provider> ); }; const HelloLicat = () => { return ( <UserInfo.Consumer> {(value) => ( <div> <h2>{value.name}</h2> <strong>{value.id}</strong> <HelloLicatTwo/> </div> )} </UserInfo.Consumer> ); }; const HelloLicatTwo = () => { return ( <UserInfo.Consumer> {(value) => ( <div> <h2>{value.name}</h2> <strong>{value.id}</strong> </div> )} </UserInfo.Consumer> ); }; export default App;
src / App.js
HelloLicat์— UserInfoContext.Provider๋กœ ๊ฐ์‹ธ์„œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด consumer๋กœ ์ „๋‹ฌ๋˜๋Š” value ๊ฐ’์ด ๋ฐ”๋€๋‹ˆ๋‹ค.
ย 
๋‹ค๋ฅธ ๊ฐ’๋“ค๋„ ๋„ฃ์–ด๋ณด์„ธ์š”!
<UserInfo.Provider value={{ name: "ali", id: "nodeMaster" }}>
ย 
์ด๋•Œ, Provider๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ˆ ๊ผญ value๋ฅผ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
const App = () => { return ( <UserInfoContext.Provider> <HelloLicat /> </UserInfoContext.Provider> ); }; // ERROR ๋ฐœ์ƒ
src / App.js