react 수업

14. context

gongmille 2024. 9. 9. 18:18

-context?

리액트 컴포넌트들 사이에서 데이터를 기존의 프롭을 통해 전달하는 방식 대신 컴포넌트 트리를 통해 곧바로 전달하는 새로운 방식.

ex)로그인 여부, 정보, UI테마, 현재 언어 등등

function App(props){
	return <Toolbar theme="dark" />;
}

function Toolbar(props){
	//이 컴포넌트는 ThemedBytton에 theme를 넘겨주기 위해서 'theme' prop을 가져야만 한다.
    //현재 테마를 알아야 하는 모든 버튼에 대해서 props로 전달하는 것은 괸장히 비효율적이다.
    return (
    	<div>
        	<ThemedButton theme={props.theme}/>
        </div>
    );
}

function ThemedButton(props) {
	return <Button theme={props.theme} />;
}

예시 - context 사용을 안한 상태

 

const ThemeContext = React.createContext('light');

function App(props){
	return (
    	<ThemeContext.Provider theme="dark">
        	<Toolbar />
        </ThemeContext.Provider>
    );
}

function Toolbar(props){
	//이 컴포넌트는 ThemedBytton에 theme를 넘겨주기 위해서 'theme' prop을 가져야만 한다.
    //현재 테마를 알아야 하는 모든 버튼에 대해서 props로 전달하는 것은 괸장히 비효율적이다.
    return (
    	<div>
        	<ThemedButton />
        </div>
    );
}

function ThemedButton(props) {
	return (
    	<ThemeContext.Consumer>
        	{value => <Button theme={value} />}
        </ThemeContext.Consumer>
    );
}

예시-context 사용 한 상태

 

-컴포넌트와 context가 연동되면 재사용성이 떨어지기 때문에 무조건 써야 하는 건 아니다.

 

-주의점

provider 컴포넌트가 재렌더링 될 때마다 모든 하위 consumer 컴포넌트가 재렌더링 되기 때문에 {something: 'something'}같은 식으로 값을 직접 넣는게 아닌 const[예시,set예시]=useState(예시)식으 state에 저장해서 해당 state를 넣어주야 한다.

 

 -여러개의 context 사용하려면 provider를 중첩해서 사용한다.

const ExContext1 = React.createContext('예시');
const ExContext2 = React.createContext({name:'예시'});

function App(props){
...
	return (
    	<ExContext1.provider value={...}>
        	<ExContext2.provider value={...}>
            	...
            </ExContext2.provider>
        </ExContext1.provider>
    );
}

...

function Content(props){
	return(
    	<ExContext1.Consumer>
        	{theme => (
            	<ExContext2.Consumer>
                	{theme => (...)}
                </ExContext2.Consumer>
            )}
        </ExContext1.Consumer>
    );
}

 

-hook을 사용하면 좀 더 쉽게 사용할 수 있다. 무거운 작업일 경우 최적화 해야한다.

const MyContext = React.createContext('예시');

function MyContext(props){
	const value = useContext(MyContext);
    
    return(...);
}

 

-실습

import React from "react";

const ThemeContext = React.createContext();
ThemeContext.displayName = "ThemeContext";

export default ThemeContext;

ThemeContext.jsx

 

import {useContext} from "react";
import ThemeContext from "./ThemeContext";

function MainContent(props){
    const {theme, toggleTheme} = useContext(ThemeContext);

    return(
        <div style={{width:"100vw",height:"100vh",padding:"1.5rem",
            backgroundColor: theme == "light" ? "white" : "black",
            color : theme == "light" ? "black" : "white"
        }}>
            <p>안녕하세요. 테마 변경 사이트 입니다.</p>
            <button onClick={toggleTheme}>테마 변경</button>
        </div>
    );
}

export default MainContent;

MainContent.jsx

 

import { useState, useCallback } from "react";
import ThemeContext from "./ThemeContext";
import MainContent from "./MainContent";

function DarkOrLight(props){
    const [theme, setTheme] = useState("light");

    const toggleTheme = useCallback(() => {
        if(theme == "light"){
            setTheme("dark");
        }else if(theme == "dark"){
            setTheme("light");
        }
    },[theme]);

    return (
        <ThemeContext.Provider value={{theme, toggleTheme}}>
            <MainContent />
        </ThemeContext.Provider>
    );
}

export default DarkOrLight;

DarkOrLight.jsx

 

(index.js 생략)

 

 

'react 수업' 카테고리의 다른 글

16. 미니 프로젝트 -미니 블로그 화면 만들기  (1) 2024.09.13
15. styling  (0) 2024.09.10
13.Composition, Inheritance  (0) 2024.09.07
12. lifting state up  (0) 2024.09.07
11. forms  (1) 2024.09.05