티스토리 뷰

책/리다기

리다기 정리7(context)

안양사람 2021. 1. 24. 19:55
728x90
SMALL

새 context 만들기

import {createContext} from 'react';

const ColorContext=createContext({color:'black'});

export default ColorContext;

 

consumer

<ColorContext.Consumer>
  {value=>(
    <div style={{background:value.colr}}/>
  )}
</ColorContext.Consumer>

 

provider

<ColorContext.Provider value={{color:'red'}}>
  <div>
    <ColorBox/>
  </div>
</ColorContext.Provider>

 

동적 Context 사용

import { createContext, useState } from "react";

const ColorContext = createContext({
  state: { color: "black", subcolor: "red" },
  actions: {
    setColor: () => {},
    setSubcolor: () => {},
  },
});

const ColorProvider = ({ children }) => {
  const [color, setColor] = useState("black");
  const [subcolor, setSubcolor] = useState("red");

  const value = {
    state: { color, subcolor },
    actions: { setColor, setSubcolor },
  };
  return (
    <ColorContext.Provider value={value}>{children}</ColorContext.Provider>
  );
};

//const ColorConsumer=ColorContext.Consumer와 같은 의미
const { Consumer: ColorConsumer } = ColorContext;

//ColorProvider와 ColorConsumer 내보내기
export { ColorProvider, ColorConsumer };

export default ColorContext;

 

app.js

import React from "react";
import ColorBox from "./components/ColorBox";
import SelectColors from "./components/SelectColors";
import { ColorProvider } from "./contexts/color";

const App = () => {
  return (
    <ColorProvider>
      <div>
        <SelectColors />
        <ColorBox />
      </div>
    </ColorProvider>
  );
};

export default App;

 

Consumer 대신 Hook 사용

  const { state } = useContext(ColorContext);

 

클래스

Consumer 대신 static contextType 사용

  static contextType = ColorContext;

이렇게 하면 this.context를 조회했을 때 현재 Context의 value를 가리키게 된다.

 

여기서

import React from "react";
import { ColorConsumer } from "../contexts/color";

const colors = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"];

const SelectColors = () => {
  return (
    <div>
      <h2>색상을 선택하세요.</h2>
      <ColorConsumer>
        {({ actions }) => (
          <div style={{ display: "flex" }}>
            {colors.map((color) => (
              <div
                key={color}
                style={{
                  background: color,
                  width: "24px",
                  height: "24px",
                  cursor: "pointer",
                }}
                onClick={() => actions.setColor(color)}
                onContextMenu={(e) => {
                  e.preventDefault();
                  actions.setSubcolor(color);
                }}
              />
            ))}
          </div>
        )}
      </ColorConsumer>
      <hr />
    </div>
  );
};

export default SelectColors;

 

훅으로 더 간편하게

import React, { useContext } from "react";
import ColorContext from "../contexts/color";

const colors = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"];

const SelectColors = () => {
  const { actions } = useContext(ColorContext);
  return (
    <div>
      <h2>색상을 선택하세요.</h2>
      <div style={{ display: "flex" }}>
        {colors.map((color) => (
          <div
            key={color}
            style={{
              background: color,
              width: "24px",
              height: "24px",
              cursor: "pointer",
            }}
            onClick={() => actions.setColor(color)}
            onContextMenu={(e) => {
              e.preventDefault();
              actions.setSubcolor(color);
            }}
          />
        ))}
      </div>
      <hr />
    </div>
  );
};

export default SelectColors;
728x90
LIST

' > 리다기' 카테고리의 다른 글

리다기 정리9(리덕스 미들웨어)  (0) 2021.01.27
리다기 정리8(리덕스)  (0) 2021.01.25
리다기 정리6(뉴스뷰어 만들기)  (0) 2021.01.22
리다기 정리5(immer, SPA)  (0) 2021.01.22
리다기 정리4(아이콘, 최적화)  (0) 2021.01.21
댓글
공지사항