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