Skip to content

ContextApi

nuguya edited this page Dec 1, 2019 · 1 revision

ContextApi with React hook

What Context

context๋ฅผ ์ด์šฉํ•˜๋ฉด ๋‹จ๊ณ„๋งˆ๋‹ค ์ผ์ผ์ด props๋ฅผ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š๊ณ ๋„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ „์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ.

์ผ๋ฐ˜์ ์ธ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ (์ฆ‰, ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ž์‹์—๊ฒŒ) props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์˜ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋“ค์— ์ „ํ•ด์ค˜์•ผ ํ•˜๋Š” props์˜ ๊ฒฝ์šฐ ์ด ๊ณผ์ •์ด ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Œ.

context๋ฅผ ์ด์šฉํ•˜๋ฉด, ํŠธ๋ฆฌ ๋‹จ๊ณ„๋งˆ๋‹ค ๋ช…์‹œ์ ์œผ๋กœ props๋ฅผ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์•„๋„ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Œ

context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด redux,mobx ์—์„œ์˜ ์ฒ˜๋Ÿผ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•œ ๊ณณ์—์„œ ํ•  ์ˆ˜ ์žˆ์Œ.

context์˜ ์ฃผ๋œ ์šฉ๋„๋Š” ๋‹ค์–‘ํ•œ ๋ ˆ๋ฒจ์— ๋„ค์ŠคํŒ…๋œ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ.

context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง€๋ฏ€๋กœ ๊ผญ ํ•„์š”ํ•  ๋•Œ๋งŒ ์จ์•ผํ•จ.

์ด์œ ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ

  • ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์˜ˆ๋กœ ๋“ค์ž๋ฉด host-page์—์„œ host์˜ ์ •๋ณด ์ฆ‰ hostID, profile image, email, name ๋“ฑ๋“ฑ์˜ ์ •๋ณด๋Š” host page ๋‚ด์˜ ์ „์ฒด์ ์ธ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์‚ฌ์šฉ๋  ์—ฌ์ง€๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ์œผ๋กœ context ์„ค์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํŽธํ•ด์„œ ์‚ฌ์šฉ.

ContextApi ์‚ฌ์šฉ

1. create Context

//src/libs/hostContext.js
import React from "react";

const HostContext = React.createContext({});
const HostProvider = HostContext.Provider;

export { HostContext, HostProvider };
  • ๋ฆฌ์—‘ํŠธ hook์—์„œ๋Š” Consumer๋ฅผ ๋”ฐ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ •์˜ํ•˜์ง€ ์•Š์Œ.

  • Context ์˜ค๋ธŒ์ ํŠธ์— ํฌํ•จ๋œ React ์ปดํฌ๋„ŒํŠธ์ธ Provider๋Š” context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ context์˜ ๋ณ€ํ™”๋ฅผ ์•Œ๋ฆฌ๋Š” ์—ญํ• 

2. Providing Context

Provider๋ฅผ Context๋ฅผ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ผ๋‹ค. host app ์ „์ฒด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌํ”„๋กœ์ ํŠธ์—์„  app.js๋ฅผ ๊ฐ์ŒŒ์Œ

//src/App/App.js
return (
		<HostProvider value={hostInfo}>
			<div className="App">
				<Header />
				<Nav />
				{modal && <NewPollModal />}
				<Content event={event} />
			</div>
		</HostProvider>
	);
  • Provider์˜ value๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ context๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜์žˆ์Œ

3. Consuming Context

Provider๋กœ ๊ฐ์‹ผ ์ปดํฌ๋„ŒํŠธ์˜ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ context๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ react hook์—์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ consumer๋กœ ๊ฐ์‹ธ์ง€ ์•Š๊ณ  useContext๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ฐธ์กฐ ๊ฐ€๋Šฅ useContext๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์œ„์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง์„ ์ด๋ฃจ๋Š” provider๋ฅผ ์ฐพ์•„ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” context๋ฅผ ์ฐธ์กฐ.

//src/component/HeaderAccountAvata.j
import { makeStyles } from "@material-ui/core";
import Avatar from "@material-ui/core/Avatar";
import React, { useContext } from "react";
import { HostContext } from "../libs/hostContext";

function HeaderAccountAvata({ userName }) {
	const host = useContext(HostContext);
	console.log(host);
	const useStyles = makeStyles({
		headerAvatar: {
			backgroundColor: "#FFF",
			color: "#212529",
			margin: "0.5rem",
			"&:hover": {
				color: "#FFF",
				backgroundColor: "#69747f",
			},
		},
		avatarImage: {
			width: "2.5rem",
			height: "2.5rem",
			borderRadius: "15px",
		},
	});
	const classes = useStyles();
	const inner = userName.slice(0, 1);

	return (
		<Avatar className={classes.headerAvatar}>
			<img className={classes.avatarImage} src={host.image}></img>
		</Avatar>
	);
}

export default HeaderAccountAvata;
  • ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ ํ—ค๋”๋ถ€๋ถ„์— host profile image๋ฅผ ๋œจ์œ„๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ host์— ๋Œ€ํ•œ ์ •๋ณด๋Š” app์ด ์‹œ์ž‘๋  ๋•Œ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๋ฐ›๊ณ  ์ด๋Š” createModal,hostModal ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— context๋กœ ์‚ฌ์šฉ.

react hook with context api

Clone this wiki locally